「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
「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
);routes.MapMvcAttributeRoutes();
[Route("{controller}/{action}/{id}", Name="xxxx")]
[Route("{action=Top")]
public class XXXXXController : Controller
{
public ActionResult Top() { ・・・ }
}ルートプレフィックスを使用すると、モデルレベルに、
「URL with parameters」のルート部分の定義を追加できる。
この時、ブラウザから
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 Resultを返す。
詳細はAction Resultを参照。
Requestを検索してValueを取得するクラス。
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());
前述のModelBinder?の動作を制御する。
通常、
から取得するようになっているが、
以下の属性をAction Methodの引数に対して使用すると、この動作を変更できる。
ASP.NET MVCは、ASP.NET Web Formsと比べて、
オーバーポスティング攻撃を受け易いため引数を明記する仕組み。
@modelで定義したModelプロパティと、
のHtmlヘルパーを使用する。
以下のように双方向バインドする。
return View(vm);
@Model ViewModel ・・・ Html.TextBoxFor?(model => model.Category)
通常、Modelプロパティは、Modelでアクセスするが、 ここでのmodelはラムダ式の仮引数名なので自由。
Controller のAction Methodは、View の選択と指示として、
ActionResult クラスのオブジェクトを返す必要がある。
Action Methodで、
return View();
と、Viewを指定しないoverloadで呼び出すと、
/Views/コントローラ名/アクション名.cshtml
を呼び出す。
ActionResult? クラスには、以下の種類が存在する。
| 項番 | 種類 | 概要・用途 | コード例(ヘルパー・メソッド) |
| 1 | ViewResult? | 指定された全体 View の表示を指示する。 基本的には HTML.BeginForm の場合に使用する。 | return View("Result"); ("Result" は全体 View 名) |
| 2 | PartialViewResult? | 指定された部分 View の表示を指示する。 基本的には Ajax.BeginForm の場合に使用する。 | return PartialView?("Result"); ("Result" は部分 View 名) |
| 3 | RedirectResult? | 指定した URL にリダイレクトする場合に使用する。 | return Redirect("http://www.wings.msn.to/"); |
| 4 | RedirectToActionResult? | 指定した Controller, Action にリダイレクトする場合に使用する。 | return RedirectToAction?("Index"); |
| 5 | 指定したルートパラメタ(routeName, routeValues)にリダイレクトする場合に使用する。 | return RedirectToRoute?("View Product", new { ProductName? = <商品名> }); | |
| 6 | FilePathResult? | 指定されたパスの内容をファイルとして出力 | return File("C:\temp\file.zip", "application/zip", "file.zip"); |
| 7 | FileContentResult? | byte配列の内容をファイルとして出力 | return File(bytes, "application/pdf"); |
| 8 | FileStreamResult? | ストリームの内容をファイルとして出力 | return new FileStreamResult?(fileStream, "application/pdf"); |
| 9 | ContentResult? | プレーン・テキストを出力(CSV出力等) | Return Content("こんにちは、世界!", "text/plain"); |
| 10 | JsonResult? | 指定されたコンテンツをJSONとして出力(Ajax通信) | return Json(JsonConvert?.SerializeObject?(result), JsonRequestBehavior?.AllowGet?); |
| 11 | JavaScriptResult? | 指定されたコンテンツをJavaScriptスクリプトとして出力 | return JavaScript(code); |
| 12 | EmptyResult? | 何もしない | - |
Viewではなく、HTTP状態コードを返す。
| 項番 | 種類 | 概要・用途 | コード例(ヘルパー・メソッド) |
| 1 | HttpStatusCodeResult? | 任意のHTTP応答コードをセット | - |
| 2 | HttpUnauthorizedResult? | HTTP応答コード「401 Unauthorized」をセット | - |
| 3 | HttpNotFoundResult? | HTTP応答コード「404 NotFound?」をセット | - |
可能
| 項番 | 分類 | 属性 | 概要 |
| 1 | 承認 | Authorize属性 | 認証済みアクセス(Cookie認証、Token認証) |
| 2 | 承認 | ChildActionOnly属性 | 子アクションとしてのみ呼び出し可能に設定 |
| 3 | 承認 | RequireHttps?属性 | HTTPSアクセスのみ呼び出し可能に設定 |
| 4 | 承認 | ValidateInput?属性 | XSS対策に使用する。 |
| 5 | 承認 | ValidateAntiForgeryToken属性 | CSRF対策に使用する。 |
| 6 | 例外 | HandleError?属性 | <CustomErrors? mode="On or RemoteOnly?"/> +FilterConfig?に設定した時のカスタムエラーページの定義 |
| 7 | Action/例外/Result | OutputCache?属性 | 出力キャッシュルールの定義 |
| 8 | Action/Result | AsyncTimeout?属性 | 非同期処理のタイムアウトの定義 |
| 9 | Override | OverrideAuthentication?属性 | グローバル・モデルなど上位で定義されたフィルタを上書き |
| OverrideAuthorization?属性 | |||
| OverrideAction?属性 | |||
| OverrideResult?属性 | |||
| OverrideException?属性 |
ControllerからのActionMethod?の呼び出しを制御する。
| 項番 | 属性 | 概要 |
| 1 | HttpXxxxx属性 | Action Methodが受け付けるHTTP Methodを指定 |
| 2 | AcceptVerbs属性 | Action Methodが受け付ける1つ以上のHTTP Methodを指定 |
| 3 | NonAction?属性 | Action Methodでないことを明示する。 |
| 4 | ActionName属性 | Action Method名と別名のAction Nameを付与する。 |
セレクタ属性は、自作可能。
この技術の登場の背景には C10k problem (C10K問題)と言うものがある模様。
public Task<ActionResult> Index()
public async Task<ActionResult> Index()
ここでは、B層クラスではなく、
「B層クラスが返すViewに渡される
Entity, Bean, POCO的なクラス(ViewModel?)」
について説明する。
ControllerからViewにデータを渡すときに使用する入れ物的なモノ。
Viewスクリプトから強く型付けされたViewModel?を参照する際に使用する。
@inherits System.Web.Mvc.WebViewPage<ViewModelClass>
@model ViewModelClass
return View(vm);
@Model ViewModel
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);
}(Viewヘルパーという呼称もあるようだが、
ここではHtmlヘルパーという呼称に統一する)
従来の ASP.NET では、ASP.NET Web コントロールを使用して、
ラベルやテキストボックスなどのコントロールを表示していたが、
ASP.NET MVC では、基本的に、以下の様な便利な機能が実装されているHtmlヘルパーを使用する。
ASP.NET MVC では、主に以下のような Htmlヘルパーが使用できる。
| 項番 | HTMLタグ | Htmlヘルパー |
| 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通信の結果をページの一部に反映させるようなケースで利用することになるだろう。
@modelに置き換えられた。
Viewスクリプトから強く型付けされたViewModelを参照する際に使用する。
マスタページを利用する際、定義されたsectionを実装する。
Viewスクリプト内にHtmlヘルパーを定義。
@...
@(...)
@{...}@if(...) {
・・・
}
else if {
・・・
}
else {
・・・
}@switch (i)
{
case 0:
・・・
break;
case 1:
・・・
break;
・・・
default:
・・・
break;
}@while (flg)
{
・・・
}@for (var i = 0; i < 10; i++)
{
・・・
}@foreach (var obj in list)
{
・・・
}@:
<text>・・・</text>
@* ... *@
<!-- ... -->
ASP.NET MVC のテンプレートは、グルーピングを目的に、既定で以下のフォルダ構成となっている。
それぞれのフォルダには、以下のようにファイルを配置することが推奨されている。
| 項番 | フォルダ名 | 配置されるファイル | 備考 |
| 1 | App_Start | 起動時に、初期設定を行うモジュール | - |
| 2 | Contents | CSS | BundleConfig? が使用しているため、既定の CSS ファイルは変更しない |
| 3 | Controllers | Controller | - |
| 4 | Models | Model | - |
| 5 | Scripts | JavaScript | BundleConfig? が使用しているため、既定の JavaScript ファイルは変更しない |
| 6 | Views | View | 対応する Controller 名のフォルダ以下に、View のファイルを配置する 例 Views\(コントローラー名)\Index.cshtml |
Area (区分) とは、ASP.NET MVC アプリケーションを論理的に分割する仕組みのことである。
(ASP.NET MVC プロジェクトをシステム全体とすると、Area ごとにサブシステム (のようなもの) に分割できる。
App_Start のマップルートが追加されるような感じ、と理解すると分かりやすいかもしれない)
Tags: :.NET開発, :ASP.NET, :ASP.NET MVC