Open棟梁Project - マイクロソフト系技術情報 Wiki
「ASP.NET MVCの用語」は
「ASP.NET MVCの利用方法」と比べて、
ASP.NET MVCの基本的なトピックをまとめています。
Modelには、
がある。
View = 画面表示のための処理。
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が実行される。
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); ValueProviderFactories.Factories.Add(new CookieValueProviderFactory()); ValueProviderFactories.Factories.Add(new SessionValueProviderFactory()); ValueProviderFactories.Factories.Add(new ServerVariablesValueProvider()); ValueProviderFactories.Factories.Add(new TempDataValueProviderFactory());
ValueProvider?を使って、引数の名前と一致するキー名を探して、値をバインドする。
マップの方法
Action Methodの結果として、Action Resultを返す。
詳細はAction Resultを参照。
Controller のAction Methodは、View の選択と指示として、
ActionResult クラスのオブジェクトを返す必要がある。
Action Methodで、
return View();
と、Viewを指定しないoverloadで呼び出すと、
/Views/コントローラ名/アクション名.cshtml
を呼び出す。
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? | 何もしない | - |
Viewではなく、HTTP状態コードを返す。
MVC 4 以降であれば、以下のように書ける。
public Task<ActionResult> Index()
public async Task<ActionResult> Index()
View には、
Webページのビューエンジンには以下の2つのものがある。
従来の ASP.NET と同様、
式やコードブロックを コード・ナゲット(<% ~ %>)で囲む記述形式。
View の拡張子も、従来の ASP.NET と同様、「*.aspx」で表される。
ASP.NET MVC 3 で登場したビューエンジン。
式やコードブロックの先頭に「@」を付与する記述形式で、
冗長なコード・ナゲット(<% ~ %>)が不要になる。
View の拡張子は、C# の場合は「*.cshtml」、VB の場合は「*.vbhtml」で表される。
通常のViewはコレ。
部分 View は、「Partial View」ともいわれ、以下の用途で使われる。
@Html.Partial("_XXXXPartial", model)
@RenderPage("~/View/Controller名/_XXXXPartial.cshtml", model)
@{ Html.RenderPartial("_XXXXPartial", model); }
[ChildActionOnly] public ActionResult Current() { ・・・ return PartialView("_XXXXPartial", partialViewModel); }
従来の ASP.NET では、ASP.NET Web コントロールを使用して、
ラベルやテキストボックスなどのコントロールを表示していたが、
ASP.NET MVC では、主に以下のような Viewヘルパーが使用できる。
項番 | HTMLタグ | Viewヘルパー |
1 | フォーム <form> | Html.BeginForm? または Ajax.BeginForm? |
2 | リンク <a> | Html.ActionLink? |
3 | テキストボックス <input type="text"> | Html.TextBox? または Html.TextBoxFor? |
4 | テキストエリア <textarea> | Html.TextArea? または Html.TextAreaFor? |
5 | パスワード <input type="password"> | Html.Password または Html.PasswordFor? |
6 | チェックボックス <input type="checkbox"> | Html.CheckBox? または Html.CheckBoxFor? |
7 | ドロップダウンリスト <select> | Html.DropDownList? または Html.DropDownListFor? |
8 | リストボックス <select> | Html.ListBox? または Html.ListBoxFor? |
9 | ラジオボタン <input type="radio"> | Html.RadioButton? または Html.RadioButtonFor? |
10 | 隠しフィールド <input type="hidden"> | Html.Hidden または Html.HiddenFor? |
Html.xxxx と Html.xxxxFor の2種類のHTMLヘルパーがある。
ただし、HTTP を経由しての双方向バインディングになるので、
処理方式的には、以下のような処理シーケンスになる。
ヘッダーやフッター、サイドメニューなどをアプリケーションで共通的に表示させたい場合、
マスターページを使用してレイアウトを共通化させることができる。
マスターページには、画面ごとに個別実装が必要な箇所を定義する。
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
メインのコンテンツ領域以外に、画面ごとに個別実装が必要な箇所を定義する場合、
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>
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; // 使用するマスターページを指定 } @* メインのコンテンツ領域 *@ <h2>Index</h2> @* セクション (サブのコンテンツ領域) *@ @section scripts{ <script type="text/javascript"> ... </script> }
で囲む必要がある。
@{ Layout = "~/Views/Shared/_XXXXLayout.cshtml"; }
@{ Layout = "~/View/Controller名/_YYYYLayout.cshtml"; }
return View("YYYY, "_XXXXLayout");
return View("YYYY, "_YYYYLayout");
@{ Layout = "~/Views/Shared/_XXXXLayout.cshtml"; }
BeginForm?には以下の2つのものがある。
従来のASPなどでMVC方式を採用した場合と同じ、画面全体を再描画する仕組み。
クライアント・サイドのJavaScriptフレームワークとシームレスに連動して部分更新を実現する仕組み。
その性質上、Ajax通信の結果をページの一部に反映させるようなケースで利用することになるだろう。
ここでは、B層クラスではなく、
「B層クラスが返すViewに渡される
Entity, Bean, POCO的なクラス(ViewModel?)」
について説明する。
ControllerからViewにデータを渡すときに使用する入れ物的なモノ。
Tags: :ASP.NET, :ASP.NET MVC