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

目次

概要

モジュール化の考え方

まず、Model と View と Controller の役割について整理する。

ModelとViewの関係

Model (0..1) <---> (1) View

Model (0) <---> (1) View

View が、Model が保持するデータを何も表示しない状態。(静的なページなど?)

Model (1) <---> (1) View

View が、Model が保持するデータを参照し、ユーザーに表示している状態。
ただし、View が参照できるのは「Model のプロパティ」のみであり、View から直接 Model のメソッドが呼ぶことはしない。

ControllerとViewの関係

View (1..*) <---> (1) Controller

View (1) <---> (1) Controller

1 つの View に対して、1 つの Controller を対応させる考え方。
その View からは、対応する Controller へのみリクエストを送る。
Controller の処理の結果は、対応する View にのみ指示を送る、というもの。
Controller の処理の結果を、別の View に表示させたい場合は、Controller.RedirectToAction? メソッドなどを使用して、その View に対応した Controller に処理をリダイレクトする。

乱暴な言い方をすれば、従来の ASP.NET の WebForm? に近い考え方、と言えるかもしれない。

View (1..*) <---> (1) Controller

複数の View に対して、1 つの Controller を対応させる考え方。

たとえば、受注処理を行うアプリケーションを考えると、「受注作成画面」「受注内容更新画面」「受注削除画面」など、複数の View に分かれていても、同じ「受注」業務に関するリクエストは 1 つの Controller が受け付ける、という考え方。
スキャフォールディング(scaffolding)が、この考え方を採用している。
(1 つの Model に対して、その Model に関するリクエストを受け付ける 1 つの Controller、および CRUD を行う 4 つの View が作成される)

モジュール化の要約

CRUD を 1 つの View で行うか?View を分けるか?など、画面設計にも関係するので、メリット/デメリットを考慮の上、どちらを採用するかを決定する。

スキャフォールディング方式

View ごとに Controller を作成する方式

Controller の作成

Action の作成

URL ルーティング

ユーザーがブラウザーに URL を入力すると、RouteConfig?.cs / .vb ファイルに定義されているルーティング規則を使用してURL が解析され、コントローラーのパスが特定される。

コントローラーは、要求を処理する適切なアクション メソッドを決定する。 既定では、以下のように URL はコントローラー名とアクション名を含む必要がある。
ここで、「id 値」とはアクションの引数名のことであり、アクションが「id」という名前の引数を持つ場合、URL に記述することでアクションの引数にその値を渡すことができる。
ただし、アクション名と id 値は省略可能で、アクション名を省略すると、Index アクションが実行される。

http://(サーバー名)/(コントローラー名)/(アクション名)/(id 値)

アクションメソッドと HTTP メソッド

アクションメソッドには、特定の HTTP メソッドのみを受け入れる属性を付与することができる。

なお、メソッド属性を指定しなかった場合、そのアクションメソッドはすべての HTTP メソッドを受け入れる。

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

戻り値

アクションメソッドの結果として、クライアントに返す適切なビューを選択し、表示を指示する。
詳細はアクションメソッドの戻り値を参照。

Model の作成

モジュール化の考え方のように、Model には 2 つの意味がある。

View の作成

Razer、ASPX の使い分け

View には、Model のプロパティ参照用、if 文や for 文などの制御用にサーバー処理を埋め込むことができる。
サーバー処理の記法に、Razer 構文、ASPX 構文がある。

ASPXRazor
インライン式 (プロパティの値を表示する場合など)<%: 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

BeginForm? の使い分け

ASP.NET MVC には、<form> タグを生成する HTML ヘルパーが 2 種類ある。
BeginForm? ヘルパーは引数にコントローラー名、アクション名が付与でき、指定したアクションメソッドにリクエストを送ることができる。

HTML.BeginForm?

通常の <form> タグを生成する場合に使用する。

Ajax.BeginForm?

<form> タグに Ajax リクエスト用の属性が付与され、リクエストが非同期で処理される。

参考

From タグの切り方

画面設計によるが、以下を考慮する。

複数 Form の場合は Form をネストさせないこと。
#HTML の仕様で Form のネストは禁止されている。

HTML ヘルパーの使い分け

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

Html.xxxx

Html.TextBox?("Category") のように、プロパティを文字列でマップ指定する場合は、"For" がつかない HTML ヘルパーを使用する。
この場合、Model から View への一方向バインディングとなる。

Html.xxxxFor

Html.TextBoxFor?(model => model.Category) のように、プロパティをラムダ式でマップ指定する場合は、"For" で終わる HTML ヘルパーを使用する。

この場合、Model と View との双方向バインディングとなる。

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

使い分け

上記を踏まえて、M/V/C の多重度、および BeginForm? を使い分ける。

個人的には、

が良いのではないかと考える。

グリッドの生成

ASP.NET MVC でグリッドのある View を作成する場合、以下の 3 種類が考えられる。

View

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 を作成する方式ともに、リクエストの処理フローは以下のようになる。

  1. View から、対応する Controller にリクエストを送る
    (書こうと思えば、任意の Controller にリクエストを送ることはできるが、View と Controller の関係が複雑になるのでオススメしない)
  2. Controller はリクエストを受け付け、Model に処理を指示する
  3. Model は業務ロジックを実行し、データを更新する
  4. Controller は View に表示を指示する

ここで、どの View に表示の指示をするかによって、使用する ActionResult? クラスが変わる。

フォルダ構成

ASP.NET MVC のテンプレートには、グルーピングを目的に、既定で以下のフォルダ構成となっている。
それぞれのフォルダには、以下のようにファイルを配置することが推奨されている。

フォルダ名配置されるファイル備考
App_Start起動時に、初期設定を行うモジュール-
ContentsCSSBundleConfig? が使用しているため、既定の CSS ファイルは変更しない
ControllersController-
ModelsModel-
ScriptsJavaScriptBundleConfig? が使用しているため、既定の JavaScript ファイルは変更しない
ViewsView対応する Controller 名のフォルダ以下に、View のファイルを配置する

Views
-(コントローラー名)
-Index.cshtml

Area

Area (区分) とは、ASP.NET MVC アプリケーションを論理的に分割する仕組みのことである。
(ASP.NET MVC プロジェクトをシステム全体とすると、Area ごとにサブシステム (のようなもの) に分割できる。
App_Start のマップルートが追加されるような感じ、と理解すると分かりやすいかもしれない)

情報の持ち回り・状態管理方式

チェック処理方式

クライアント

JavaScript でのチェック。
jQuery Validation プラグインなども使用可能。

サーバ

Action メソッド内でのチェック。
個別にチェックロジックを実装するか、アノテーションを使用したチェックが可能。

脆弱性

サニタイジング

リクエスト検証


タグ: :ASP.NET MVC


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