ASP.NET MVC 3
(2011 年 4 月 Tools Update を含む)
ASP.NET MVC 3 は、確立された設計パターンと、ASP.NET と .NET Framework の機能を使用して、スケーラブルな標準ベースの Web アプリケーションを構築するためのフレームワークです。
これは ASP.NET MVC 2 と並列インストールされるので、今すぐ使い始めてください!
インストーラーはこちらからダウンロードしてください
主な機能
- NuGet を介して拡張可能な統合スキャフォールディング システム
- HTML 5 対応プロジェクト テンプレート
- 新しい Razor ビュー エンジンを含む表現力豊かなビュー
- 依存関係の挿入とグローバル アクション フィルターを使用した強力なフック
- 控えめな JavaScript、jQuery Validation、JSON バインドによる豊富な JavaScript のサポート
- 以下の機能リストを参照してください
トップ リンク
ASP.NET MVC 3 の新機能
- Phil Haack: ASP.NET MVC 3 がリリース
- Scott Hanselman: ASP.NET MVC3、WebMatrix、NuGet、IIS Express、Orchard がリリース - Microsoft の 1 月の Web リリースのコンテキスト
- Scott Guthrie: ASP.NET MVC 3、IIS Express、SQL CE 4、Web ファーム フレームワーク、Orchard、WebMatrix のリリースを発表
- ASP.NET MVC 3 のリリース ノート
インストールとヘルプ
- Web Platform Installer (推奨) を使用して ASP.NET MVC 3 をインストールする
- インストーラ実行可能ファイル を使用して ASP.NET MVC 3 をインストールする
- Visual Studio 11 開発者プレビュー用の ASP.NET MVC 3 をインストールする
- ASP.NET MVC 3 チュートリアルの概要を読む
- フォーラムでヘルプを参照して ASP.NET MVC 3 について話し合う
ASP.NET MVC 3 の概要
ASP.NET MVC 3 は ASP.NET MVC 1 および 2 を基盤として構築されており、コードの簡略化と、より深い拡張性の実現の両方を可能にする優れた機能が追加されています。 このトピックでは、このリリースに含まれる多くの新機能の概要を次のセクションにまとめて説明します。
- MvcScaffold 統合による拡張可能なスキャフォールディング
- HTML 5 対応プロジェクト テンプレート
- Razor ビュー エンジン
- 複数のビュー エンジンのサポート
- コントローラーの機能強化
- JavaScript と Ajax
- モデル検証の機能強化
- 依存関係の挿入の機能強化
- その他の新機能
MvcScaffold 統合による拡張可能なスキャフォールディング
新しいスキャフォールディング システムを使用すると、フレームワークをまったく初めて使用する場合は、フレームワークを生産的に選択して使用を開始することがより簡単になり、経験豊富で何をしているかが既にわかっている場合は、一般的な開発タスクを自動化できます。
これは、MvcScaffolding と呼ばれる新しい NuGet スキャフォールディング パッケージでサポートされています。 "スキャフォールディング" という用語は、多くのソフトウェア テクノロジで、"編集してカスタマイズできるソフトウェアの基本的なアウトラインをすばやく生成する" ことを意味するために使用されています。 ASP.NET MVC 用として作成するスキャフォールディング パッケージは、いくつかのシナリオで大いに役立ちます。
- ASP.NET MVC を初めて学習する場合。なぜなら、便利な作業コードを迅速に取得し、ニーズに応じてコードを編集して適応させることができるからです。 これにより、空白のページを目にしてどこから始めればよいか分からないというトラウマから救われます!
- MVC ASP.NET をよく理解していて、オブジェクト リレーショナル マッパー、ビュー エンジン、テスト ライブラリなど、いくつかの新しいアドオン テクノロジを探索している場合。なぜなら、そのテクノロジの作成者が、そのスキャフォールディング パッケージも作成している可能性があるからです。
- ある種の同様のクラスまたはファイルの繰り返し作成が作業に含まれる場合。なぜなら、テスト フィクスチャ、デプロイ スクリプト、その他必要なものすべてを出力するカスタム スキャフォールディングを作成できるからです。 チームの全員もカスタム スキャフォールディングを使用できます。
MvcScaffolding のその他の機能は次のとおりです。
- C# および VB プロジェクトのサポート
- Razor および ASPX ビュー エンジンのサポート
- ASP.NET MVC 領域へのスキャフォールディングとカスタム ビュー レイアウト/マスターの使用のサポート
- T4 テンプレートを編集することで、出力を簡単にカスタマイズできます
- カスタム PowerShell ロジックとカスタム T4 テンプレートを使用して、まったく新しいスキャフォールディングを追加できます。 これら (およびこれらに指定したカスタム パラメーター) は、コンソールのタブ入力候補一覧に自動的に表示されます。
- さまざまなテクノロジ用の追加のスキャフォールディング機能を含む NuGet パッケージを取得し (たとえば、現在 LINQ to SQL の概念実証用があります)、それらを組み合わせて一致させることができます
ASP.NET MVC 3 Tools Update には、次のような、このスキャフォールディング システムに対する優れた Visual Studio サポートが含まれています。
- [コントローラーの追加] ダイアログで、コントローラーの作成、読み取り、更新、削除のアクションとそれに対応するビューの完全な自動スキャフォールディングがサポートされるようになりました。 既定では、これにより、EF Code First を使用してデータ アクセス コードがスキャフォールディングされます。
- [コントローラーの追加] ダイアログでは、MvcScaffolding などの NuGet パッケージを使用した拡張可能なスキャフォールディングがサポートされています。 これにより、カスタム スキャフォールディングをこのダイアログに接続できるため、NHibernate などのその他のデータ アクセス テクノロジ用としてだけでなく、興味がある場合は ODBCDirect を使用した JET 用としても、スキャフォールディングを作成できるようになります。
ASP.NET MVC 3 でのスキャフォールディングの詳細については、次のリソースを参照してください。
次を含む Steve Sanderson の投稿シリーズ:
Scott Hanselman の PDC 2010 セッション からの投稿「Microsoft とのブログの構築 "Web 愛の無名パッケージ"」
HTML 5 プロジェクト テンプレート
[新しいプロジェクト] ダイアログには、HTML 5 バージョンのプロジェクト テンプレートを有効にするチェックボックスが含まれています。 これらのテンプレートでは、Modernizr 1.7 を活用して、下位レベルのブラウザーで HTML 5 と CSS 3 の互換性サポートを提供します。
Razor ビュー エンジン
ASP.NET MVC 3 には、次の利点を備えた Razor という名前の新しいビュー エンジンが付属しています。
- Razor 構文はクリーンで簡潔であり、最小数のキーストロークが必要です。
- Razor は、C# や Visual Basic などの既存の言語に基づいていることを一因として、学習が容易です。
- Visual Studio には、Razor 構文の IntelliSense とコードの色付けが含まれています。
- Razor ビューは、アプリケーションの実行や Web サーバーの起動を必要とせずに単体テストできます。
一部の新しい Razor 機能には、次のものが含まれます。
- ビューに渡される型を指定するための
@model
構文。 @* *@
コメント構文。- サイト全体に対して既定値 (
layoutpage
など) を 1 回指定する機能。 - HTML エンコードなしでテキストを表示するための
Html.Raw
メソッド。 - 複数のビュー (_viewstart.cshtml または _viewstart.vbhtml ファイル) 間でコードを共有するためのサポート。
Razor には、次のような新しい HTML ヘルパーも含まれています。
Chart
。 グラフをレンダリングします。ASP.NET 4 のグラフ コントロールと同じ機能を提供します。WebGrid
。 データ グリッドをレンダリングします。ページングと並べ替え機能を備えています。Crypto
。 ハッシュ アルゴリズムを使用して、適切にソルト化およびハッシュされたパスワードを作成します。WebImage
。 イメージをレンダリングします。WebMail
。 電子メールを送信します。
Razor について詳しくは、次のリソースを参照してください。
- Razor を紹介する Scott Guthrie のブログ記事
- Scott Guthrie's blog post introducing the @model keyword
- Razor レイアウトを紹介する Scott Guthrie のブログ記事
- ASP.NET API クイック リファレンス
- MVC 3 リリース ノート
複数のビュー エンジンのサポート
ASP.NET MVC 3 の [ビューの追加] ダイアログ ボックスでは、操作するビュー エンジンを選択できます。[新しいプロジェクト] ダイアログ ボックスでは、プロジェクトの既定のビュー エンジンを指定できます。 Web Forms ビュー エンジン (ASPX)、Razor、または Spark、NHaml、NDjango などのオープンソース ビュー エンジンを選択できます。
コントローラーの機能強化
グローバル アクション フィルター
アクション メソッドの実行前またはアクション メソッドの実行後にロジックを実行したい場合があります。 これをサポートするために、ASP.NET MVC 2 はアクション フィルターを提供しています。 アクション フィルターは、特定のコントローラーのアクション メソッドに、アクション前とアクション後の動作を追加するための宣言型の手段を提供するカスタム属性です。 ただし、場合によっては、すべてのアクション メソッドに適用されるアクション前またはアクション後の動作を指定したい場合があります。 MVC 3 では、グローバル フィルターを GlobalFilters
コレクションに追加することでこれらを指定できます。 グローバル アクション フィルターの詳細については、次のリソースを参照してください。
新しい "ViewBag" プロパティ
MVC 2 コントローラーでは、遅延バインディング ディクショナリ API を使用してビュー テンプレートにデータを渡すことを可能にする ViewData
プロパティがサポートされています。 MVC 3 では、ViewBag
プロパティと共に多少単純な構文を使用して、同じ目的を達成することもできます。 たとえば、ViewData["Message"]="text"
を記述する代わりに、ViewBag.Message="text"
を記述できます。 ViewBag
プロパティを使用するために、厳密に型指定されたクラスを定義する必要はありません。 これは動的プロパティであるため、代わりにプロパティを取得または設定するだけで、これらのプロパティは実行時に動的に解決されます。 内部的には、ViewBag
プロパティは名前と値のペアとして ViewData
ディクショナリに保存されます。 (注: MVC 3 のほとんどのプレリリース バージョンでは、ViewBag
プロパティの名前は ViewModel
プロパティでした。)
新しい "ActionResult" 型
MVC 3 では、次の ActionResult
型および対応するヘルパー メソッドが新規であるか拡張されています。
- HttpNotFoundResult。 クライアントに 404 HTTP 状態コードを返します。
- RedirectResult。 ブール値パラメーターに応じて、一時的リダイレクト (HTTP 302 状態コード) または永続的リダイレクト (HTTP 301 状態コード) を返します。 この変更と組み合わせて、Controller クラスには、永続的リダイレクトを実行するための 3 つのメソッド (
RedirectPermanent
、RedirectToRoutePermanent
、RedirectToActionPermanent
) が用意されました。 これらのメソッドは、Permanent
プロパティがtrue
に設定されたRedirectResult
のインスタンスを返します。 - HttpStatusCodeResult。 ユーザー指定の HTTP 状態コードを返します。
JavaScript と Ajax の機能強化
既定では、MVC 3 の Ajax および検証ヘルパーは、控えめな JavaScript アプローチを使用します。 控えめな JavaScript は、インライン JavaScript を HTML に挿入することを回避します。 これにより、HTML が小さくなってすっきりし、JavaScript ライブラリの入れ替えやカスタマイズが容易になります。 MVC 3 の検証ヘルパーは、既定で jQueryValidate
プラグインも使用します。 MVC 2 の動作が必要な場合は、web.config ファイル設定を使用して、控えめな JavaScript を無効にすることができます。 JavaScript と Ajax の機能強化の詳細については、次のリソースを参照してください。
- Wikipedia サイトでの控えめな JavaScript の基本的な概要
- 控えめな JavaScript に関する Brad Wilson の投稿
- 控えめな JavaScript 検証に関する Brad Wilson の投稿
- Razor と控えめな JavaScript を使用した MVC 3 アプリケーションの作成 (ASP.NET サイト上のチュートリアル)
- MVC 3 リリース ノート
既定で有効なクライアント側の検証
以前のバージョンの MVC では、クライアント側の検証を有効にするには、ビューから Html.EnableClientValidation
メソッドを明示的に呼び出す必要がありました。 MVC 3 では、クライアント側の検証が既定で有効であるため、これは不要になりました。 (これを無効にするには、web.config ファイルの設定を使用します。)
クライアント側の検証を機能させるには、サイト内の適切な jQuery および jQuery 検証ライブラリを引き続き参照する必要があります。 これらのライブラリは、独自のサーバーでホストすることも、Microsoft や Google のコンテンツ配信ネットワーク (CDN) などの CDN から参照することもできます。
リモート検証コントロール
ASP.NET MVC 3 では、jQuery 検証プラグインのリモート検証コントロールのサポートを活用できる新しい RemoteAttribute クラスがサポートされています。 これにより、サーバー上で定義したカスタム メソッドをクライアント側の検証ライブラリが自動的に呼び出し、サーバー側でしか実行できない検証ロジックを実行できるようになります。
次の例では、UserName
フィールドを検証するために、Remote
属性で、クライアント検証によって UsersController
クラス上の UserNameAvailable
という名前のアクションを呼び出すように指定しています。
public class User
{
[Remote("UserNameAvailable", "Users")]
public string UserName { get; set; }
}
次の例は、対応するコントローラーを示しています。
public class UsersController
{
public bool UserNameAvailable(string username)
{
if(MyRepository.UserNameExists(username))
{
return "false";
}
return "true";
}
}
Remote
属性の使用方法の詳細については、MSDN ライブラリの「方法: ASP.NET MVC でリモート検証を実装する」を参照してください。
JSON バインディングのサポート
ASP.NET MVC 3 には、アクション メソッドが JSON でエンコードされたデータを受け取り、それをアクション メソッド パラメーターにモデル バインドできるようにする、組み込みの JSON バインドサポートが含まれています。 この機能は、クライアント テンプレートとデータ バインディングが含まれるシナリオで役立ちます。 (クライアント テンプレートを使用すると、クライアントで実行されるテンプレートを使用して、1 つのデータ項目または一連のデータ項目を書式設定および表示できます。)MVC 3 では、サーバー上で JSON データを送受信するアクション メソッドにクライアント テンプレートを簡単に接続できます。 JSON バインディングのサポートの詳細については、Scott Guthrie の MVC 3 プレビューに関するブログ投稿の「JavaScript と AJAX の機能強化」セクションを参照してください。
モデル検証の機能強化
"DataAnnotations" メタデータ属性
ASP.NET MVC 3 は、DisplayAttribute
のような DataAnnotations
メタデータ属性をサポートしています。
"ValidationAttribute" クラス
ValidationAttribute
クラスは、.NET Framework 4 で、検証対象のオブジェクトなど、現在の検証コンテキストに関する詳細情報を提供する新しい IsValid
オーバーロードをサポートできるように改善されました。 これにより、モデルの別のプロパティに基づいて現在の値を検証できる、より豊富なシナリオを実現できます。 たとえば、新しい CompareAttribute
属性を使用すると、モデルの 2 つのプロパティの値を比較できます。 次の例では、ComparePassword
プロパティが有効になるには Password
フィールドと一致する必要があります。
public class User
{
[Required]
public string Password { get; set; }
[Required, Compare("Password")]
public string ComparePassword { get; set; }
}
検証インターフェイス
IValidatableObject インターフェイスを使用すると、モデル レベルの検証を実行でき、モデル全体の状態またはモデル内の 2 つのプロパティ間の状態に固有の検証エラー メッセージを提供できます。 MVC 3 では、モデル バインド時に IValidatableObject
インターフェイスからエラーを取得し、組み込みの HTML フォーム ヘルパーを使用して、ビュー内で影響を受けるフィールドを自動的にフラグ設定または強調表示できるようになりました。
IClientValidatable インターフェイスを使用すると、ASP.NET MVC が、検証コントロールがクライアント検証をサポートしているかどうかを実行時に検出できます。 このインターフェイスは、さまざまな検証フレームワークと統合できるように設計されています。
検証インターフェイスの詳細については、Scott Guthrie の MVC 3 プレビューに関するブログ投稿の「モデル検証の機能強化」セクションを参照してください。 (ただし、ブログでの "IValidateObject" に関する言及は "IValidatableObject" であることに注意してください。)
依存関係の挿入の機能強化
ASP.NET MVC 3 では、依存関係の挿入 (DI) の適用と、依存関係の挿入または制御の反転 (IOC) コンテナーとの統合のサポートが強化されています。 DI のサポートは、次の領域に追加されています。
- コントローラー (コントローラー ファクトリの登録と挿入、コントローラーの挿入)。
- ビュー (ビュー エンジンの登録と挿入、ビュー ページへの依存関係の挿入)。
- アクション フィルター (フィルターの検出と挿入)。
- モデル バインダー (登録と挿入)。
- モデル検証プロバイダー (登録と挿入)。
- モデル メタデータ プロバイダー (登録と挿入)。
- 値プロバイダー (登録と挿入)。
MVC 3 は、共通サービス ロケーター ライブラリと、そのライブラリの IServiceLocator
インターフェイスをサポートする DI コンテナーをサポートしています。 また、DI フレームワークの統合を容易にする新しい IDependencyResolver
インターフェイスもサポートしています。
MVC 3 の DI について詳しくは、次のリソースを参照してください。
その他の新機能
NuGet の統合
ASP.NET MVC 3 は、セットアップの一環として NuGet を自動的にインストールして有効にします。 NuGet は無料のオープンソース パッケージ マネージャーで、プロジェクト内での .NET ライブラリとツールの検索、インストール、使用を容易にします。 これは、Visual Studio プロジェクトのすべての種類 (ASP.NET Web Forms や ASP.NET MVC を含む) で動作します。
NuGet を使用すると、オープンソース プロジェクト (Moq、NHibernate、Ninject、StructureMap、NUnit、Windsor、RhinoMocks、Elmah などのプロジェクト) を管理している開発者が、ライブラリをパッケージ化し、オンライン ギャラリーに登録できるようになります。 これにより、これらのライブラリのいずれかを使用したい .NET 開発者が、パッケージを検索して、作業中のプロジェクトにインストールすることが簡単になります。
ASP.NET 3 Tools Update では、JavaScript ライブラリがプレインストールされた NuGet パッケージがプロジェクト テンプレートに含まれているため、これらを NuGet 経由で更新できます。 Entity Framework Code First も、NuGet パッケージとしてプレインストールされています。
NuGet の詳細については、NuGet のドキュメントを参照してください。
部分ページ出力キャッシュ
ASP.NET MVC では、バージョン 1 以降、ページ全体の応答の出力キャッシュがサポートされています。 MVC 3 では、部分ページ出力キャッシュもサポートされています。このため、応答の領域またはフラグメントを簡単にキャッシュできます。 キャッシュの詳細については、MVC 3 リリース候補に関する Scott Guthrie のブログ記事の「部分ページ出力キャッシュ」セクションと MVC 3 リリース ノートの「子アクション出力キャッシュ」セクションを参照してください。
要求の検証をきめ細かく制御する
ASP.NET MVC には、XSS および HTML インジェクション攻撃から自動的に保護するのに役立つ要求の検証が組み込まれています。 ただし、ユーザーが HTML コンテンツ (ブログ エントリや CMS コンテンツ内など) を投稿できるようにしたい場合など、要求の検証を明示的に無効にしたい場合があります。 モデルまたはビュー モデルに AllowHtml 属性を追加して、モデル バインド中にプロパティごとに要求の検証を無効にできるようになりました。 要求の検証の詳細については、次のリソースを参照してください。
- MVC 3 リリース候補に関する Scott Guthrie のブログ記事の「控えめな JavaScript と検証」セクション。
- MVC 3 リリース ノート
拡張可能な [新しいプロジェクト] ダイアログ ボックス
ASP.NET MVC 3 では、プロジェクト テンプレート、ビュー エンジン、単体テスト プロジェクト フレームワークを [新しいプロジェクト] ダイアログ ボックスに追加できます。
テンプレート スキャフォールディングの機能強化
ASP.NET MVC 3 スキャフォールディング テンプレートは、以前のバージョンの MVC よりも、モデル上の主キー プロパティを識別し、これらを適切に処理する能力が優れています。 (たとえば、スキャフォールディング テンプレートでは、主キーが編集可能なフォーム フィールドとしてスキャフォールディングされないよう徹底できるようになりました。)
既定では、作成スキャフォールディングと編集スキャフォールディングで Html.TextBoxFor
ヘルパーの代わりに Html.EditorFor
ヘルパーが使用されるようになりました。 これにより、[ビューの追加] ダイアログ ボックスでビューが生成されるときのデータ注釈属性の形式で、モデルでのメタデータのサポートが強化されます。
"Html.LabelFor" および "Html.LabelForModel" の新しいオーバーロード
LabelFor
メソッドと LabelForModel
ヘルパー メソッドに新しいメソッド オーバーロードが追加されました。 この新しいオーバーロードを使用すると、ラベル テキストを指定またはオーバーライドできます。
セッションレス コントローラーのサポート
ASP.NET MVC 3 では、コントローラー クラスでセッション状態を使用するかどうかを、さらに、使用する場合は、セッション状態を読み取り/書き込みと読み取り専用のどちらにするかを指定できます。 セッションレス コントローラーのサポートの詳細については、MVC 3 リリース ノートを参照してください。
新しい "AdditionalMetadataAttribute" クラス
AdditionalMetadata 属性を使用して、モデル プロパティの ModelMetadata.AdditionalValues
ディクショナリを設定できます。 たとえば、管理者にのみ表示する必要があるプロパティがビュー モデルにある場合は、次の例に示すように、そのプロパティに注釈を付けることができます。
public class ProductViewModel
{
[AdditionalMetadata("AdminOnly", true)]
public string RefundCode {get; set;}
}
このメタデータは、製品ビュー モデルがレンダリングされるときに、任意の表示テンプレートまたはエディター テンプレートで使用できるようになります。 メタデータ情報を解釈するかどうかは開発者次第です。
AccountController の機能強化
インターネット プロジェクト テンプレートの AccountController が大幅に改善されました。
新しい イントラネット プロジェクト テンプレート
Windows 認証を有効にし、AccountController を削除する、新しいイントラネット プロジェクト テンプレートが含まれています。