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 が受け付ける、という考え方。

モジュール化の要約

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

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

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

Controller の作成

モジュール化

モジュール化の要約で紹介した、

何れかの方針に合わせて、Controllerを作成する。

利用可能な属性

HTTP メソッド属性

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

AcceptVerbs? 属性([AcceptVerbs?(HttpVerbs?.Post)] 等)が用意されていたが、
MVC 2 からはHttpGet?, HttpPost?, HttpPut?, HttpDelete?という4つの属性が追加された。

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

ActionName?属性

Action Method名と、外部に公開するAction Nameとを別にする。

例えば

項番Action Method名ActionName?処理の内容
DeleteDelete削除画面の初期表示処理
DeleteConfirmed?Delete削除処理の実行

Model の作成

モジュール化

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

利用可能な属性

DisplayName?

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 ヘルパー

Html.xxxx と Html.xxxxFor

グリッド生成用のHTML ヘルパー

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

画面遷移の方法

モジュール化の要約で紹介した、スキャフォールディング方式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 メソッド内でのチェック。
個別にチェックロジックを実装するか、アノテーションを使用したチェックが可能。

脆弱性

サニタイジング

リクエスト検証


Tags: :ASP.NET MVC


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