Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

MVC

MVCの基本的な考え方

M(Model)に実装される処理

Modelには、

がある。

V(View)に実装される処理

View = 画面表示のための処理。

C(Controller)に実装される処理

モジュールの作成順

  1. C(Controller)を作成
  2. V(View)を作成
  3. M(Model)を作成
  4. C(Controller)にAction Methodを追加し、C→M→Vと繋げる。

C(Controller)関連

URL ルーティング

routes.MapRoute(
    "Default",                     // Route name
    "{controller}/{action}/{id}",  // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

この時、ブラウザから

http://server/applicationname/Products/Index/1

というURLでリクエストを送信した場合、

http://(Server FQDN名)/(Controller名)/(Action Method名)/(id 値)

ルート定義に従い、ページハンドラは

と判断し、

Products Controllerの Index Action Methodを呼び出し、Action Methodの引数として "1" を渡す。
Action Method名と id 値は省略可能で、Action Method名を省略すると、Index Action Methodが実行される。

Action Method

リクエストデータと引数の関連付け

マップの方法

戻り値

Action Methodの結果として、Action Resultを返す。
詳細はAction Resultを参照。

非同期Controller

旧(AsyncController?を継承する。)

Task<ActionResult?>を返す。

MVC 4 以降であれば、以下のように書ける。

参考

Action Result

Controller のAction Methodは、View の選択と指示として、
ActionResult クラスのオブジェクトを返す必要がある。

Action Methodで、

return View();

と、Viewを指定しないoverloadで呼び出すと、

/Views/コントローラ名/アクション名.cshtml

を呼び出す。

ActionResult?の種類とヘルパー・メソッド

ActionResult? クラスには、以下の種類が存在する。

種類概要・用途コード例(ヘルパー・メソッド)
ViewResult?指定された全体 View の表示を指示する。
基本的には HTML.BeginForm の場合に使用する。
return View("Result");
("Result" は全体 View 名)
PartialViewResult?指定された部分 View の表示を指示する。
基本的には Ajax.BeginForm の場合に使用する。
return PartialView?("Result");
("Result" は部分 View 名)
RedirectResult?指定した URL にリダイレクトする場合に使用する。return Redirect("http://www.wings.msn.to/");
RedirectToActionResult?指定した Controller, Action にリダイレクトする場合に使用する。return RedirectToAction?("Index");
指定したルート名にリダイレクトする場合に使用する。return RedirectToRoute?("View Product", new { ProductName? = <商品名> });
FilePathResult?指定されたパスの内容をファイルとして出力return File("C:\temp\file.zip", "application/zip", "file.zip");
FileContentResult?byte配列の内容をファイルとして出力return File(bytes, "application/pdf");
FileStreamResult?ストリームの内容をファイルとして出力return new FileStreamResult?(fileStream, "application/pdf");
ContentResult?プレーン・テキストを出力(Ajax通信)Return Content("こんにちは、世界!", "text/plain");
JsonResult?指定されたコンテンツをJSONとして出力(Ajax通信)return Json(JsonConvert?.SerializeObject?(result), JsonRequestBehavior?.AllowGet?);
JavaScriptResult?指定されたコンテンツをJavaScriptスクリプトとして出力return JavaScript(code);
HttpUnauthorizedResult?承認の失敗時にHTTP応答コード「401 Unauthorized」をセット
EmptyResult?何もしない

HttpStatusCodeResult?

Viewではなく、HTTP状態コードを返す。

V(View)関連

ビューエンジン

Webページのビューエンジンには以下の2つのものがある。

ASPX

従来の ASP.NET と同様、
式やコードブロックを コード・ナゲット(<% ~ %>)で囲む記述形式。
View の拡張子も、従来の ASP.NET と同様、「*.aspx」で表される。

Razor(主流)

ASP.NET MVC 3 で登場したビューエンジン。
式やコードブロックの先頭に「@」を付与する記述形式で、
冗長なコード・ナゲット(<% ~ %>)が不要になる。
View の拡張子は、C# の場合は「*.cshtml」、VB の場合は「*.vbhtml」で表される。

参考

Viewヘルパー

従来の ASP.NET では、ASP.NET Web コントロールを使用して、
ラベルやテキストボックスなどのコントロールを表示していたが、

主な Viewヘルパー

ASP.NET MVC では、主に以下のような Viewヘルパーが使用できる。

2種類のHTMLヘルパー

Html.xxxx と Html.xxxxFor の2種類のHTMLヘルパーがある。

ただし、HTTP を経由しての双方向バインディングになるので、
処理方式的には、以下のような処理シーケンスになる。

マスターページ

ヘッダーやフッター、サイドメニューなどをアプリケーションで共通的に表示させたい場合、
マスターページを使用してレイアウトを共通化させることができる。
マスターページには、画面ごとに個別実装が必要な箇所を定義する。

ビューエンジン

配置場所と使用方法

マスターページへのセクションの定義

メインのコンテンツ領域以外に、画面ごとに個別実装が必要な箇所を定義する場合、
RenderSection? を使用して「セクション」と呼ばれるサブのコンテンツ領域を定義する。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    <!-- メインのコンテンツ領域を描画する場所を定義 -->
    @RenderBody()

    @Scripts.Render("~/bundles/jquery")
    <!-- セクション (サブのコンテンツ領域) を描画する場所を定義 -->
    @RenderSection("scripts", required: false)
</body>
</html>

コンテンツページの実装

で囲む必要がある。

BeginForm?

BeginForm?には以下の2つのものがある。

Html.BeginForm?の特徴

Ajax.BeginForm?の特徴

M(Model)関連

ViewBag?, ViewData?, TempData?

ControllerからViewにデータを渡すときに使用する入れ物的なモノ。

ViewBag?

ViewData?

TempData?

検証機能

Model側

ModelState?・・・

View側

スキャフォールディング

概要

スキャフォールディング(Scaffolding)。
日本語で「足場」、「骨組み」の意味。

を自動で生成する機能。

M(Model)

C(Controller)

V(View)

項番View名対応するAction Method名使用されるTemplate名
1Index.cshtmlIndexList
2Details.cshtmlDetailsDetails
3Create.cshtmlCreateCreate
4Edit.cshtmlEditEdit
5Delete.cshtmlDeleteDelete

ADO.NET Entity Framework のコードファースト機能

ASP.NET MVC 4 の新機能

プロジェクトテンプレートの追加

テンプレートが追加された。

モバイルデバイス対応

ASP.NET MVC 4 で追加された「モバイル アプリケーション」テンプレートを使用して、モバイルデバイス向けアプリケーションを作成できる。このテンプレートでは、jQuery Mobile をベースとしており、タッチ操作に最適化した UI を構築できる。

複数ブラウザに対応させるためのディスプレイモード

ASP.NET MVC のディスプレイモードを利用すると、PC 向けサイト、モバイル向けサイトのように、ブラウザに応じてレイアウトを変えることができる。ディスプレイモードは、Global.asax の Application_Start メソッドに定義することで使用できる。
例えば、iPhone 向けのディスプレイモードを定義したい場合は、以下のように実装する。

protected void Application_Start()
{
    (中略)

    DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone")
    {
        ContextCondition = (context => context.GetOverriddenUserAgent().IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
    });
}

この時、通常の「Index.cshtml」と同じフォルダに「Index.iPhone.cshtml」を作成し、iPhone 向けのレイアウトを定義すると、

http://server/application/Controller/Index/id

という同じ URL に対し、PC のブラウザからアクセスした場合は「Index.cshtml」が使用され、iPhone からアクセスした場合は「Index.iPhone.cshtml」が使用されるようになる。

Web API

RESTful な HTTP サービスを構築するためのフレームワーク。
既定では、以下のようにルーティングが定義されている。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

したがって、Web API のAction Methodを呼び出す際の URL は以下のようになる。

http://server/application/Controller/id

ASP.NET MVC と違い、Web API のルート定義にはAction Methodの指定がない。

Web API を使用した場合、リクエストの HTTP メソッドに応じて、
以下のようにControllerのAction Methodが自動的に呼び出される。

項番HTTP メソッド呼び出されるメソッド
GET"Get" で始まる名前のメソッド
POST"Post" で始まる名前のメソッド
PUT"Put" で始まる名前のメソッド
DELETE"Delete" で始まる名前のメソッド

Web API を利用した場合のコントローラの例を以下に示す。同じコントローラの中で GET に対応したメソッドを複数定義したい場合などは、以下のようにオーバーロードで対応できる。

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

OAuth / OpenID 対応

ASP.NET MVC 4 の「インターネット アプリケーション」テンプレートを使用すると、OAuth/OpenId? を使用した Facebook / Twitter / Google / Microsoft などのアカウントによる認証が可能となる。
これらのアカウントによる認証を行う場合は、App_Start フォルダの AuthConfig? クラスで設定を記述する。

public static void RegisterAuth()
{
    OAuthWebSecurity.RegisterFacebookClient(
        appId: "",
        appSecret: "");
}

Microsoft.Web.WebPages?.OAuth.OAuthWebSecurity? クラスには、
各サービスに応じて、アカウント認証を行うためのメソッドが用意されている。

項番メソッド処理内容
RegisterFacebookClient?Facebook アカウントによる認証
RegisterGoogleClient?Google アカウントによる認証
RegisterLinkedInClient?LinkedIn? アカウントによる認証
RegisterMicrosoftClient?Microsoft アカウントによる認証
RegisterTwitterClient?Twitter アカウントによる認証
RegisterYahooClient?Yahoo アカウントによる認証

シングルページ アプリケーション

単一ページで構成される Ajax アプリケーション。
HTML5 / CSS や、各種 JavaScript ライブラリを使用することで、UX の向上、マルチデバイス対応が可能となる。
シングルページ アプリケーションでは、クライアントサイドは各種 JavaScript ライブラリを使用してデータ操作を行い、サーバサイドは Web API を使用して RESTful にAction Methodを実行する。
「シングル ページ アプリケーション」テンプレートを使用すると、既定で以下の JavaScript ライブラリが使用できる。

項番JavaScript ライブラリ説明
jQueryJavaScript のコーディングを支援するライブラリ
jQuery UIjQuery をベースとした UI ライブラリ
jQuery ValidateHTML フォームの入力検証を行う jQuery プラグイン
knockout.jsJavaScript による MVVM (Model-View-ViewModel?) フレームワーク
modernizr.jsHTML5/CSS のブラウザ対応状況を調査するためのライブラリ

Tags: :ASP.NET MVC


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS