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

ValidateAntiForgeryToken?属性

CSRF対策に使用する。

Model の作成

モジュール化

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

利用可能な属性

テンプレート・ヘルパーと呼ばれる(System.ComponentModel?.DataAnnotations?)。
ViewやControllerのスキャフォールディング生成の動作を制御する属性。

DataType?属性

型情報

[DataType(DataType.XXXX)]

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

カスタム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? クラスを下記のように変える様に実装する。

フォルダ構成

既定のフォルダ構成

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

使用可能

チェック処理方式

クライアント

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

サーバ

[こちら>ASP.NET MVCの用語#za7f960c]を参照。

スキャフォールディング

概要

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

を自動で生成する機能。

M(Model)

C(Controller)

V(View)

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

Model Meta Dataを使用した開発

チェック処理方式 - サーバ

スキャフォールディング

脆弱性

サニタイジング

リクエスト検証

その他

ADO.NET Entity Framework のコードファースト機能

ASP.NET MVC 4 の新機能

プロジェクトテンプレートの追加

テンプレートが追加された。

モバイルデバイス対応

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

複数ブラウザに対応させるためのディスプレイモード

ASP.NET MVC のディスプレイモードを利用すると、PC 向けサイト、モバイル向けサイトのように、ブラウザに応じてレイアウトを変えることができる。ディスプレイモードは、Global.asax の Application_Start メソッドに定義することで使用できる。
例えば、iPhone 向けのディスプレイモードを定義したい場合は、以下のように実装する。

protected void Application_Start()
{
    (中略)

    DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone")
    {
        ContextCondition = (context => context.GetOverriddenUserAgent().IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
    });
}

この時、通常の「Index.cshtml」と同じフォルダに「Index.iPhone.cshtml」を作成し、iPhone 向けのレイアウトを定義すると、

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

という同じ URL に対し、PC のブラウザからアクセスした場合は「Index.cshtml」が使用され、iPhone からアクセスした場合は「Index.iPhone.cshtml」が使用されるようになる。

Web API

RESTful な HTTP サービスを構築するためのフレームワーク。
既定では、以下のようにルーティングが定義されている。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

したがって、Web API のAction Methodを呼び出す際の URL は以下のようになる。

http://server/application/Controller/id

ASP.NET MVC と違い、Web API のルート定義にはAction Methodの指定がない。

Web API を使用した場合、リクエストの HTTP メソッドに応じて、
以下のようにControllerのAction Methodが自動的に呼び出される。

項番HTTP メソッド呼び出されるメソッド
GET"Get" で始まる名前のメソッド
POST"Post" で始まる名前のメソッド
PUT"Put" で始まる名前のメソッド
DELETE"Delete" で始まる名前のメソッド

Web API を利用した場合のコントローラの例を以下に示す。同じコントローラの中で GET に対応したメソッドを複数定義したい場合などは、以下のようにオーバーロードで対応できる。

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

OAuth / OpenID 対応

シングルページ アプリケーション

単一ページで構成される Ajax アプリケーション。
HTML5 / CSS や、各種 JavaScript ライブラリを使用することで、UX の向上、マルチデバイス対応が可能となる。
シングルページ アプリケーションでは、クライアントサイドは各種 JavaScript ライブラリを使用してデータ操作を行い、サーバサイドは Web API を使用して RESTful にAction Methodを実行する。
「シングル ページ アプリケーション」テンプレートを使用すると、既定で以下の JavaScript ライブラリが使用できる。

項番JavaScript ライブラリ説明
jQueryJavaScript のコーディングを支援するライブラリ
jQuery UIjQuery をベースとした UI ライブラリ
jQuery ValidateHTML フォームの入力検証を行う jQuery プラグイン
knockout.jsJavaScript による MVVM (Model-View-ViewModel?) フレームワーク
modernizr.jsHTML5/CSS のブラウザ対応状況を調査するためのライブラリ

Tags: :ASP.NET MVC


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