マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

ASP.NET MVCの利用方法」は
ASP.NET MVCの用語」と比べて、
少々高度な応用的トピックをまとめています。

モジュール化の考え方

M・V・Cの役割の整理

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

画面 or データモデル、どちらをベースにするか?

ASP.NET MVCの開発は、ViewModel?ModelMetadata?駆動になる。

このため、ViewModel?の設計が重要になるが、これを

どちらをベースにするか?でモジュール化が異なってくる。

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 を作成する方式」

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

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

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

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

アプリケーションの

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

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

たとえば、受注処理を行うアプリケーションを考えると、
「受注作成画面」・「受注内容更新画面」・「受注削除画面」など、
複数の 全体View に分かれていても、同じ「受注」業務=受注エンティティ
に関するリクエストは 1 つの Controller が受け付ける、という考え方。

モジュール化の要約

Controllerをどのような単位で作成するかにかかっている。

機能やデータ構造に対して 1 つの Controller を対応させる方式

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

Controller の作成

モジュール化

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

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

利用可能な属性

HTTP メソッド属性

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

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

AcceptVerbs? 属性は、複数のHTTPメソッドを受け入れるAction Methodの定義に使用する。

MVC 2 からはHttpGet?, HttpPost?, HttpPut?, HttpDelete?という4つの属性が追加された。

ActionName?属性

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

例えば

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

ValidateAntiForgeryToken?属性

CSRF対策に使用する。
複数ブラウザウィンドウ対応がなされているかどうかは未確認。

Model の作成

モジュール化

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

ココでは前者について言及する。

利用可能な属性

System.ComponentModel?.DataAnnotations?属性により、

の動作を制御する事ができる。

DataType?属性

型情報を指定することで、

として使用される。

[DataType(DataType.XXXX)]

DataType?の派生の属性

DataType属性と同様に利用される。

DisplayName?, Display属性

表示名(Label表示を行なうHtmlヘルパーに使用される)

DisplayFormat?属性

フォーマットの指定。

[DisplayFormat(DataFormatXXXX="YYYY")]

UIHint属性

DisplayColumn?属性

検証属性

検証属性については、コチラ

ViewModel?の作成方法

ASP.NET MVCでDataTableを使用する。

AutoMapperを使用する。

View の作成

モジュール化

Razer、ASPX の使い分け

基本、Razer(主流)を使用する。

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

GridView?的な一覧(グリッド)生成用のHtmlヘルパー

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

テンプレート・ヘルパー(テンプレートに対応したHtmlヘルパー)

DisplayFor?EditorFor?などモデル定義に応じて出力を自在に変えられるHtmlヘルパー。

Html.Hidden または Html.HiddenFor?

タイムスタンプ型など、ユーザに見えない情報だが
内部処理に必要な情報を引き継ぐ場合に使用する。

カスタムHtmlヘルパー(カスタム・コントロールみたいな)

画面遷移

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

共に、画面遷移の処理フローは以下のようになる。

処理フロー

  1. View から、対応する Controller にリクエストを送る
  2. Controller はリクエストを受け付け、Model に処理を指示する
  3. Model は業務ロジックを実行し、データを更新する
  4. Controller は View に表示を指示する

実装方法

なお、1つの View が、任意の Controller にPOSTリクエストを送る
ASP.NET Web Formsの「ページ間ポスティング」的な実装も書けるが、
View と Controller の関係が複雑になるのでオススメしない。

従って、上記の「4.」で、どの View に表示の指示をするかによって、
使用する ActionResult? クラスを下記のように変える様に実装する。

モバイル対応

Mobil Template

「モバイル アプリケーション」テンプレートを使用して、
モバイルデバイス向けアプリケーションを作成できる。
このテンプレートでは、jQuery Mobile をベースとしており、
タッチ操作に最適化した UI を構築できる。

DisplayModes?

Bootstrapによるレスポンシブデザインに頼らず、
PC 向けサイト、モバイル向けサイトの画面を分けるアプローチ。

この時、

iPhone 向けのレイアウトを定義すると、

http://server/application/Controller/Index/id

という同じ URL に対し、

その他

WebViewPage?

このクラスで設定・追加したプロパティが、
各Viewファイル(.cshtmlや.vbhtml)の開発時に使用出来るようになる。

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

ViewState?

利用不可能

Hidden

使用可能

Session

使用可能

検証機能

Action メソッド内で個別にチェックロジックを実装するか、
ModelMetadata?を使用したチェックが可能。

Model側

検証属性

以下の属性を使用して検証可能。

項番属性概要
DataType属性(enumDataType?, errmsg)指定のデータ型に変換可能か
Required属性(errmsg)必須入力
StringLength?属性(max, errmsg)文字列の最大長
MaxLength?属性(max, errmsg)文字列の最大長
MinLength?属性(min, errmsg)文字列の最小長
Range属性(min, max, errmsg)範囲
RegularExpression?属性(pattern, errmsg)正規表現
MembershipPassword?属性()パスワード
Compare属性(targetname, errmsg)比較(e-mailやpasswdの確認用フィールドに使用する)
10Remote属性(actionMethod, errmsg)Ajaxを使用したチェック
11CustomValidation?属性()カスタム

各属性の errmsgプロパティに何も設定しなくても既定でエラーメッセージが出る。

DataType属性

DataType属性検証属性として機能する。

CustomValidation?属性

ざっくり、以下のようにして、CustomValidation?属性を使用する。

自作Validation属性

ざっくり、以下のようにして、自作Validation属性を定義して使用する。

IValidatableObject?の実装

ざっくり、以下のようにして、IValidatableObject?を使用する。
複数の検証結果を返せるのは、IValidatableObject?だけである。

Controller側

検証タイミング

Action Methodの実行前に、モデル・バインディングが行われたタイミング。

ModelStateDictionary?

View側

サーバ側

クライアント

appSettings

クライアント側検証の無効化

CustomValidation属性ではクライアント側検証が実行されない。
整合性をとるために、クライアント側検証の無効化を行なう。

<add key="ClientValidationEnabled" value="false" />

若しくは、自作Validation属性にクライアント側検証を実装する。

控えめなJavaScript

クライアント側検証に「控えめなJavaScript」のパラダイムが導入されている。

<add key="UnobtrusiveJavaScriptEnabled" value="true"/>

参考

スキャフォールディング

概要

スキャフォールディング(Scaffolding)。
日本語で「足場」、「骨組み」の意味。

を自動で生成する機能。

M(Model)

設定する属性

ナビゲーション・プロパティ

C(Controller)

V(View)

項番View名対応するAction Method名使用されるTemplate名
1Index.cshtmlIndexList
2Details.cshtmlDetailsDetails
3Create.cshtmlCreateCreate
4Edit.cshtmlEditEdit
5Delete.cshtmlDeleteDelete

テンプレートをオーバーライド

ModelMetadata?を使用した開発

検証機能

スキャフォールディング

脆弱性

サニタイジング

リクエスト検証

認証

ASP.NET MVCのテンプレートでは、

ASP.NET Forms認証

ASP.NET Identity

その他

Entity Framework

ASP.NET Web API

ASP.NET SPA


Tags: :.NET開発, :ASP.NET, :ASP.NET MVC


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