Open棟梁Project - マイクロソフト系技術情報 Wiki
まず、Model と View と Controller の役割について整理する。
Model (0..1) <---> (1) View
View が、Model が保持するデータを何も表示しない状態。(静的なページなど?)
View が、Model が保持するデータを参照し、ユーザーに表示している状態。
ただし、View が参照できるのは「Model のプロパティ」のみであり、View から直接 Model のメソッドが呼ぶことはしない。
View (1..*) <---> (1) Controller
1 つの View に対して、1 つの Controller を対応させる考え方。
その View からは、対応する Controller へのみリクエストを送る。
Controller の処理の結果は、対応する View にのみ指示を送る、というもの。
Controller の処理の結果を、別の View に表示させたい場合は、Controller.RedirectToAction? メソッドなどを使用して、その View に対応した Controller に処理をリダイレクトする。
乱暴な言い方をすれば、従来の ASP.NET の WebForm? に近い考え方、と言えるかもしれない。
複数の View に対して、1 つの Controller を対応させる考え方。
たとえば、受注処理を行うアプリケーションを考えると、「受注作成画面」「受注内容更新画面」「受注削除画面」など、複数の View に分かれていても、同じ「受注」業務に関するリクエストは 1 つの Controller が受け付ける、という考え方。
スキャフォールディング(scaffolding)が、この考え方を採用している。
(1 つの Model に対して、その Model に関するリクエストを受け付ける 1 つの Controller、および CRUD を行う 4 つの View が作成される)
CRUD を 1 つの View で行うか?View を分けるか?など、画面設計にも関係するので、メリット/デメリットを考慮の上、どちらを採用するかを決定する。
ユーザーがブラウザーに URL を入力すると、RouteConfig?.cs / .vb ファイルに定義されているルーティング規則を使用してURL が解析され、コントローラーのパスが特定される。
コントローラーは、要求を処理する適切なアクション メソッドを決定する。
既定では、以下のように URL はコントローラー名とアクション名を含む必要がある。
ここで、「id 値」とはアクションの引数名のことであり、アクションが「id」という名前の引数を持つ場合、URL に記述することでアクションの引数にその値を渡すことができる。
ただし、アクション名と id 値は省略可能で、アクション名を省略すると、Index アクションが実行される。
http://(サーバー名)/(コントローラー名)/(アクション名)/(id 値)
アクションメソッドには、特定の HTTP メソッドのみを受け入れる属性を付与することができる。
なお、メソッド属性を指定しなかった場合、そのアクションメソッドはすべての HTTP メソッドを受け入れる。
アクションメソッドの結果として、クライアントに返す適切なビューを選択し、表示を指示する。
詳細はアクションメソッドの戻り値を参照。
モジュール化の考え方のように、Model には 2 つの意味がある。
View には、Model のプロパティ参照用、if 文や for 文などの制御用にサーバー処理を埋め込むことができる。
サーバー処理の記法に、Razer 構文、ASPX 構文がある。
ASPX | Razor | |
インライン式 (プロパティの値を表示する場合など) | <%: Model.Property1 %> | @Model.Property1 |
インライン式 (エスケープ処理をスキップし、プロパティの値をそのまま表示する場合) | <%= Model.Property1 %> | @Html.Raw(Model.Property1) |
コードブロック (ロジックを直接 View に記述する場合) (C#) | <% string str = "あいうえお"; %> | @{ string str = "あいうえお"; } |
コードブロック (ロジックを直接 View に記述する場合) (VB) | <% Dim str As String = "あいうえお" %> | @Code Dim str As String = "あいうえお" End Code |
ASP.NET MVC には、<form> タグを生成する HTML ヘルパーが 2 種類ある。
BeginForm? ヘルパーは引数にコントローラー名、アクション名が付与でき、指定したアクションメソッドにリクエストを送ることができる。
通常の <form> タグを生成する場合に使用する。
<form> タグに Ajax リクエスト用の属性が付与され、リクエストが非同期で処理される。
画面設計によるが、以下を考慮する。
複数 Form の場合は Form をネストさせないこと。
#HTML の仕様で Form のネストは禁止されている。
Html.xxxx と Html.xxxxFor の2種類のHTML ヘルパーがある。
Html.TextBox?("Category") のように、プロパティを文字列でマップ指定する場合は、"For" がつかない HTML ヘルパーを使用する。
この場合、Model から View への一方向バインディングとなる。
Html.TextBoxFor?(model => model.Category) のように、プロパティをラムダ式でマップ指定する場合は、"For" で終わる HTML ヘルパーを使用する。
この場合、Model と View との双方向バインディングとなる。
ただし、HTTP を経由しての双方向バインディングになるので、処理方式的には、以下のような処理シーケンスになる。
上記を踏まえて、M/V/C の多重度、および BeginForm? を使い分ける。
個人的には、
が良いのではないかと考える。
ASP.NET MVC でグリッドのある View を作成する場合、以下の 3 種類が考えられる。
View には、画面全体を表す「全体 View」と、画面の一部分のみを表す「部分 View」がある。
部分 View は、「Partial View」ともいわれ、以下の用途で使われる。
Controller のアクションメソッドは、ActionResult クラスのオブジェクトを返す必要がある。
ActionResult? クラスには、View への指示内容によって、主に以下の種類が存在する。
種類 | 概要・用途 | コード例 |
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"); |
RedirectToRouteResult? | 指定したルート名にリダイレクトする場合に使用する。 | return RedirectToRoute?("View Product", new { ProductName? = <商品名> }); |
View();
methodは、Viewを指定しないoverloadで呼び出すと、
/Views/コントローラ名/アクション名.cshtml
を呼び出す。
上記以外にも、
などがある。
詳しくは ActionResult クラスを参照。
モジュール化の要約で紹介した、スキャフォールディング方式、View ごとに Controller を作成する方式ともに、リクエストの処理フローは以下のようになる。
ここで、どの View に表示の指示をするかによって、使用する ActionResult? クラスが変わる。
ASP.NET MVC のテンプレートには、グルーピングを目的に、既定で以下のフォルダ構成となっている。
それぞれのフォルダには、以下のようにファイルを配置することが推奨されている。
フォルダ名 | 配置されるファイル | 備考 |
App_Start | 起動時に、初期設定を行うモジュール | - |
Contents | CSS | BundleConfig? が使用しているため、既定の CSS ファイルは変更しない |
Controllers | Controller | - |
Models | Model | - |
Scripts | JavaScript | BundleConfig? が使用しているため、既定の JavaScript ファイルは変更しない |
Views | View | 対応する Controller 名のフォルダ以下に、View のファイルを配置する 例 Views -(コントローラー名) -Index.cshtml |
Area (区分) とは、ASP.NET MVC アプリケーションを論理的に分割する仕組みのことである。
(ASP.NET MVC プロジェクトをシステム全体とすると、Area ごとにサブシステム (のようなもの) に分割できる。
App_Start のマップルートが追加されるような感じ、と理解すると分かりやすいかもしれない)
JavaScript でのチェック。
jQuery Validation プラグインなども使用可能。
Action メソッド内でのチェック。
個別にチェックロジックを実装するか、アノテーションを使用したチェックが可能。
タグ: :ASP.NET MVC