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

目次

概要

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

モジュール化の考え方

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

モジュール化の要約

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

全体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削除処理の実行

ValidateAntiForgeryToken?属性

CSRF対策に使用する。

Model の作成

モジュール化

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

利用可能な属性

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

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

DataType?属性

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

として使用される。

[DataType(DataType.XXXX)]

DataType?の派生の属性

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

DisplayName?, Display属性

表示名(Label表示用のViewヘルパーに使用される)

DisplayFormat?属性

フォーマットの指定。

[DisplayFormat(DataFormatXXXX="YYYY")]

UIHint属性

DisplayColumn?属性

検証属性

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

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

HTML.BeginForm?

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

Ajax.BeginForm?

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

参考

From タグの切り方

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

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

Viewヘルパーの使い分け

HTMLヘルパー(Html.xxxx と Html.xxxxFor

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

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

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

Html.Hidden または Html.HiddenFor?

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

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

画面遷移

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

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

処理フロー

  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 に対し、

フォルダ構成

既定のフォルダ構成

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 のマップルートが追加されるような感じ、と理解すると分かりやすいかもしれない)

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

ViewState?

利用不可能

必要であれば、

ViewState?相当の状態保存処理を独自実装する必要がある
(For付きのViewヘルパー(Html.xxxxFor)を使用する)。

Hidden

使用可能

Session

使用可能

検証機能

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?属性

Controller側

検証タイミング

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

ModelStateDictionary?

View側

サーバ側

クライアント

appSettings

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

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

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

控えめなJavaScript

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

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

参考

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

スキャフォールディング

概要

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

を自動で生成する機能。

M(Model)

設定する属性

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

C(Controller)

V(View)

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

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

Model Meta Dataを使用した開発

検証機能

スキャフォールディング

脆弱性

サニタイジング

リクエスト検証

OAuth / OpenID 対応

Entity Framework

ASP.NET Web API

ASP.NET SPA


Tags: :ASP.NET, :ASP.NET MVC


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