ASP.NET MVC 3 リリース ノート

概要

このドキュメントでは、ASP.NET MVC 3 RTM for Visual Studio 2010 のリリースについて説明します。 ASP.NET MVC は、Model-View-Controller (MVC) パターンを使用する Web アプリケーションを開発するためのフレームワークです。 ASP.NET MVC 3 インストーラーには、次のコンポーネントが含まれています。

  • ASP.NET MVC 3 ランタイム コンポーネント
  • ASP.NET MVC 3 Visual Studio 2010 ツール
  • ASP.NET Web ページ ランタイム コンポーネント
  • ASP.NET Web ページ Visual Studio 2010 ツール
  • Microsoft Package Manager for .NET (NuGet)
  • Razor 構文のサポートを有効にする Visual Studio 2010 の更新プログラム。 (詳細については、サポート技術情報の記事 2483190 を参照)。

ASP.NET MVC 3 のプレリリース バージョンごとのリリース ノートの完全なセットは、ASP.NET Web サイトの次の URL にあります。

https://www.asp.net/learn/whitepapers/mvc3-release-notes

Installation Notes (SAP サポート ノート #1984787 – SUSE Linux Enterprise Server 12: インストールに関する注意事項)

Web Platform Installer (Web PI) を使用して ASP.NET MVC 3 RTM をインストールするには、次のページにアクセスしてください。

https://www.microsoft.com/web/gallery/install.aspx?appid=MVC3

あるいは、ASP.NET MVC 3 RTM for Visual Studio 2010 のインストーラーを次のページからダウンロードすることもできます。

https://go.microsoft.com/fwlink/?LinkID=208140

ASP.NET MVC 3 は、ASP.NET MVC 2 と並行してインストールしたり、実行したりできます。

ソフトウェア要件

ASP.NET MVC 3 ランタイム コンポーネントには、次のソフトウェアが必要です。

  • .NET Framework バージョン 4。

    ASP.NET MVC 3 Visual Studio 2010 ツールには、次のソフトウェアが必要です。

  • Visual Studio 2010またはVisual Web Developer 2010 Express。

ドキュメント

ASP.NET MVC のドキュメントは、MSDN Web サイトの次の URL で入手できます。

https://go.microsoft.com/fwlink/?LinkId=205717

ASP.NET MVC に関するチュートリアルやその他の情報は、ASP.NET Web サイトの次の URL の MVC ページで入手できます。

https://www.asp.net/mvc/

サポート

これは、完全にサポートされているリリースです。 テクニカル サポートを受ける方法に関する情報は、Microsoft サポート Web サイトにあります。

また、このリリースに関する質問は、自由に ASP.NET MVC フォーラムに投稿してください。ここでは、ASP.NET コミュニティのメンバーによる非公式のサポートを得られることがよくあります。

https://forums.asp.net/1146.aspx

ASP.NET MVC 2 プロジェクトの ASP.NET MVC 3 Tools Update へのアップグレード

ASP.NET MVC 3 は、同じコンピューター上に ASP.NET MVC 2 と並行してインストールできます。これにより、ASP.NET MVC 2 アプリケーションをいつ ASP.NET MVC 3 にアップグレードするかを柔軟に選択できます。

既存の ASP.NET MVC 2 アプリケーションをバージョン 3 に手動でアップグレードするには、次の操作を行います。

  1. コンピューター上に新しい空の ASP.NET MVC 3 プロジェクトを作成します。 このプロジェクトには、アップグレードに必要ないくつかのファイルが含まれます。

  2. 次のファイルを ASP.NET MVC 3 プロジェクトから ASP.NET MVC 2 プロジェクトの対応する場所にコピーします。 jQuery ライブラリへのすべての参照を新しいファイル名 (jQuery-1.5.1.js) を示すように更新することが必要になります。

    • /Views/Web.config
    • /packages.config
    • /scripts/*.js
    • /Content/themes/*.*
  3. 空の ASP.NET MVC 3 プロジェクト ソリューションのルートにある packages フォルダーを、そのソリューションの .sln ファイルが配置されているディレクトリにあるソリューションのルートにコピーします。

  4. ASP.NET MVC 2 プロジェクトに領域が含まれている場合は、/Views/Web.config ファイルを各領域の Views フォルダーにコピーします。

  5. ASP.NET MVC 2 プロジェクト内の両方の Web.config ファイルで、ASP.NET MVC バージョンをグローバルに検索して置き換えます。 次の文字列を検索します。

    System.Web.Mvc, Version=2.0.0.0
    

    これを次のコードに置き換えます。

    System.Web.Mvc, Version=3.0.0.0
    
  6. ソリューション エクスプローラーで、System.Web.Mvc (これはバージョン 2 の DLL を指します) への参照を削除してから、System.Web.Mvc (v3.0.0.0) への参照を追加します。

  7. System.Web.WebPages.dll と System.Web.Helpers.dll への参照を追加します。 これらのアセンブリは、次のフォルダーに配置されています。

    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET MVC 3\Assemblies
    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies
  8. ソリューション エクスプローラーで、プロジェクト名を右クリックし、[プロジェクトのアンロード] を選択します。 次に、プロジェクト名をもう一度右クリックし、[ProjectName.csproj の編集] を選択します。

  9. ProjectTypeGuids 要素を見つけ、{F85E285D-A4E0-4152-9332-AB1D724D3325} を {E53F8FEA-EAE0-44A6-8774-FFD645390401} に置き換えます。

  10. 変更内容を保存し、プロジェクトを右クリックして [プロジェクトの再読み込み] を選択します。

  11. アプリケーションのルート Web.config ファイルで、assemblies セクションに次の設定を追加します。

    <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, 
         PublicKeyToken=31BF3856AD364E35" />
    
    <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral,
         PublicKeyToken=31BF3856AD364E35" />
    
  12. プロジェクトで、ASP.NET MVC 2 を使用してコンパイルされたサード パーティ ライブラリを参照している場合は、アプリケーション ルートにある Web.config ファイルの configuration セクションに次の強調表示された bindingRedirect 要素を追加します。

    <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
           <assemblyIdentity name="System.Web.Mvc"
               publicKeyToken="31bf3856ad364e35"/>
           <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/>
         </dependentAssembly>
       </assemblyBinding>
    </runtime>
    

ASP.NET MVC 3 Tools Update での変更点

このセクションでは、ASP.NET MVC 3 RTM リリース以降の ASP.NET MVC 3 Tools Update リリースでの変更点について説明します。

[コントローラーの追加] ダイアログ ボックスで、ビューとデータ アクセス コードを使用してコントローラーをスキャフォールディングできるようになりました

スキャフォールディングは、アプリケーションのコントローラーとビューをすばやく生成するための方法です。 コードが生成されたら、プロジェクトの要件を満たすようにそのコードを編集できます。

ASP.NET MVC 3 で [コントローラーの追加] ダイアログ ボックスを起動するには、"ソリューション エクスプローラー" で Controllers フォルダーを右クリックし、[追加] をクリックしてから [コントローラー] をクリックします。 このダイアログ ボックスは、追加のスキャフォールディング オプションを表示するように拡張されています。

[コントローラーの追加] ダイアログ ボックスのスクリーンショット。

既定では、3 つのスキャフォールディング テンプレートを使用できます。

空のコントローラー

このテンプレートでは、空のコントローラー ファイルを生成します。 このテンプレートは、以前のバージョンの ASP.NET MVC で [作成、編集、詳細、削除の各シナリオに対するアクションを追加する] をオフにした場合の動作と同等です。 これを選択すると、それ以上のオプションを使用できません。

空の読み取り/書き込みアクションを含むコントローラー

このテンプレートでは、すべての必要なアクション メソッドを含むが、メソッド内に実装コードが含まれていないコントローラー ファイルを生成します。 このテンプレートは、以前のバージョンの ASP.NET MVC で [作成、編集、詳細、削除の各シナリオに対するアクションを追加する] をオンにした場合の動作と同等です。 これを選択すると、それ以上のオプションを使用できません。

Entity Framework を使用した、読み取り/書き込みアクションおよびビューを含むコントローラー

このテンプレートを使用すると、機能するデータ入力ユーザー インターフェイスをすばやく作成できます。 これにより、次のような幅広い一般的な要件やシナリオを処理するコードが生成されます。

  • "データ アクセス"。 生成されたコードは、データベース内のエンティティの読み取りと書き込みを行います。 既存のデータ コンテキスト クラスを選択するか、またはテンプレートで新しい DbContext クラスを生成できるようにした場合は、Entity Framework Code First アプローチで動作します。 また、既存の ObjectContext クラスを選択した場合は、Entity Framework Database First または Model First アプローチでも動作します。

  • 検証。 生成されたコードは、フォーム送信がモデル クラスで宣言されている規則に従って検証されるように、ASP.NET MVC モデル バインドおよびメタデータ機能を使用します。 これには、組み込みの検証規則 (Required および StringLength 属性など) とカスタム検証規則が含まれます。

  • 一対多関連付け。 モデル クラス間に一対多の外部キー リレーションシップを定義した場合、生成されたコードは、関連するエンティティを選択するためのドロップダウン リストを生成します。 たとえば、Entity Framework Code First 規約に従って、次のモデル クラスを定義したとします。

    public class Product
    {
         public int ProductId { get; set; }
         [Required]
         public string Name { get; set; }
    
         // Product belongs to Category
         public int CategoryId { get; set; }
         public virtual Category Category { get; set; }
    }
    public class Category
    {
         public int CategoryId { get; set; }
         [Required]
         public string Name { get; set; }
    }
    

    その後、Product クラスのコントローラーをスキャフォールディングすると、ユーザーはそのビューを使用して、各 Product インスタンスの Category オブジェクトを選択できます。

    このテンプレートでは、[コントローラーの追加] ダイアログ ボックスで追加オプションを使用できます。 [モデル クラス] では、ソリューション内の任意のモデル クラスを選択できます。これにより、ユーザーが作成または編集できるデータの種類が決定されます。

  • Entity Framework Code First を使用する場合は、任意のモデル クラスを選択できます。

  • Entity Framework Database First または Entity Framework Model First を使用している場合は、必ず、概念モデルで定義されているエンティティ クラスを選択してください。

[データ コンテキスト クラス] では、次の選択を行うことができます。

  • Code First を使用し、既存のデータ コンテキスト クラスがない場合は、**[新しいデータ コンテキスト]** を選択します。 これにより、データ コンテキスト クラスが自動的に生成されます。
  • Code First を使用し、既存のデータ コンテキスト クラスがある場合は、ここでそれを選択します。 それが、選択したモデル クラスを保持するように更新されます。
  • Database First または Model First を使用している場合は、ここでオブジェクト コンテキスト クラスを選択します。

[ビュー] では、使用するビュー エンジンを選択するか、またはどのビューもスキャフォールディングしない場合は [なし] を選択します。

[詳細オプション] を選択すると、生成されたビューの追加オプションを指定できます。 たとえば、使用するレイアウトまたはマスター ページを選択できます。

[ASP.NET MVC 3 新しいプロジェクト] ダイアログ ボックスの機能強化

新しい ASP.NET MVC 3 プロジェクトを作成するために使用するダイアログ ボックスには、次に示すような複数の機能強化が含まれています。

[新しいプロジェクト] ダイアログ ボックスのスクリーンショット。[イントラネット アプリケーション] アイコンと [Use H T M L 5 semantic markup]\(H T M L 5 セマンティック マークアップを使用する\) チェック ボックスが強調表示されています。

新しい "イントラネット プロジェクト" テンプレート

[プロジェクト テンプレート] の一覧には、新しい [イントラネット アプリケーション] テンプレートが含まれています。 このテンプレートには、フォーム認証ではなく、Windows 認証を使用する Web アプリケーションを構築するための設定が含まれています。 イントラネット アプリケーションには、プロジェクト テンプレートにカプセル化できないいくつかの IIS 設定が必要なため、このテンプレートには、プロジェクト テンプレートを IIS で機能させる方法の手順を含む Readme ファイルが含まれています。 新しい [イントラネット アプリケーション] テンプレートのドキュメントは、MSDN Web サイトの次の URL で入手できます。

https://msdn.microsoft.com/library/gg703322(VS.98).aspx

プロジェクト テンプレートが HTML5 対応になりました

[新しいプロジェクト] ダイアログ ボックスに、HTML5 固有の機能をプロジェクト テンプレートに追加するオプションが含まれるようになりました。 このオプションを選択すると、HTML5 の新しい <header><footer><navigation> の各要素を含むビューが生成されます。

以前のバージョンのブラウザーでは HTML5 固有のタグがサポートされないことに注意してください。 この制限に対応するために、HTML5 プロジェクト テンプレートには Modernizr ライブラリへの参照が含まれています。 (次のセクションを参照してください)。

プロジェクト テンプレートに Modernizr 1.7 が含まれるようになりました

Modernizr は、CSS 3 や HTML5 がまだサポートされていないブラウザーでのこれらの機能のサポートを有効にする JavaScript ライブラリです。 このライブラリは、プレインストールされた NuGet パッケージとして ASP.NET MVC 3 プロジェクトのテンプレートに含まれています。 Modernizr の詳細については、http://www.modernizr.com/ を参照してください。

プロジェクト テンプレートには jQuery、jQuery UI、jQuery Validation の更新されたバージョンが含まれています

プロジェクト テンプレートに、次のバージョンの jQuery スクリプトが含まれるようになりました。

  • jQuery 1.5.1
  • jQuery Validation 1.8
  • jQuery UI 1.8.11

これらのライブラリは、プレインストールされた NuGet パッケージとして含まれています。

プロジェクト テンプレートに ADO.NET Entity Framework 4.1 がプレインストールされた NuGet パッケージとして含まれるようになりました

ADO.NET Entity Framework 4.1 には、Code First 機能が含まれています。 Code First は、既存の Database First および Model First パターンに代わる手段を提供する、ADO.NET Entity Framework のための新しい開発パターンです。

Code First は、Visual Basic または C# で記述された POCO クラス ("単純な従来の CLR オブジェクト") を使用してモデルを定義することに重点を置いています。 その後、これらのクラスを既存のデータベースにマップしたり、データベース スキーマを生成するために使用したりできます。 DataAnnotations 属性を使用するか、または Fluent API を使用して追加の構成を提供できます。

ASP.NET MVC で Code First を使用するためのドキュメントは、ASP.NET Web サイトの次の URL で入手できます。

https://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-cs https://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

プロジェクト テンプレートには JavaScript ライブラリがプレインストールされた NuGet パッケージとして含まれています

新しい ASP.NET MVC 3 プロジェクトを作成する場合、プロジェクト テンプレートの内容にある Scripts フォルダーに直接スクリプトを追加するのではなく、NuGet を使用して前に説明した JavaScript ファイル (Modernizr ライブラリなど) をインストールすることにより、そのプロジェクトにはこれらのファイルが含まれます。 これにより、スクリプトの新しいバージョンがリリースされたら、NuGet を使用してそれらのスクリプトを最新バージョンに更新できます。

たとえば、新しい jQuery リリースの頻度を考慮した場合、プロジェクト テンプレートに含まれている jQuery のバージョンはある時点で最新ではなくなります。 ただし、jQuery はインストールされた NuGet パッケージとして含まれているため、新しいバージョンの jQuery が使用可能になったら NuGet のダイアログ ボックスで通知されます。

jQuery はファイル名にバージョン番号が含まれているため、jQuery を最新バージョンに更新するには、その jQuery ファイルを参照する <script> タグを、新しいファイル名を使用するように更新することも必要です。 含まれているその他のスクリプト ライブラリは、スクリプト名にバージョン番号が含まれていないため、より簡単にそれらの最新バージョンに更新できます。

ASP.NET MVC 3 での既知の問題

  • 場合によっては、"インストールがエラー コード (0x80070643) で失敗しました" というエラー メッセージでインストールが失敗することがあります。 この問題を回避する方法については、サポート技術情報の記事 2531566 を参照してください。
  • コントローラーを追加するためのスキャフォールディングでは、Entity Framework 内のエンティティ継承サポートを利用するエンティティはスキャフォールディングされません。 たとえば、基本の Person クラスが Student クラスによって継承される場合、その Student クラスのスキャフォールディングではコンパイルされないコードが生成されます。
  • ソリューション フォルダー内に新しい ASP.NET MVC 3 プロジェクトを作成すると、NullReferenceException エラーが発生します。 これを回避するには、ソリューションのルートに ASP.NET MVC 3 プロジェクトを作成してから、それをソリューション フォルダーに移動します。
  • ReSharper がインストールされていると、Razor 構文の IntelliSense が機能しません。 ReSharper がインストールされているときに、ASP.NET MVC 3 の Razor IntelliSense サポートを利用したい場合は、現時点でこれらを一緒に使用する方法について説明している、Hadi Hariri のブログにある Razor IntelliSense と ReSharper に関するエントリを参照してください。
  • インストール中、EULA 同意ダイアログ ボックスには、ライセンス条項が意図したよりも小さいウィンドウに表示されます。
  • Razor ビュー (.cshtml または .vbhtml ファイル) を編集している場合、ビュー。 ASP.NET MVC 3 には、Razor ビューのスニペットは含まれていません。ASP.NET MVC のコード スニペットを選択すると、スニペットが表示されます
  • Visual Studio がインストールされていないコンピューターに ASP.NET MVC 3 for Visual Web Developer Express をインストールし、後で Visual Studio をインストールした場合は、ASP.NET MVC 3 を再インストールする必要があります。 Visual Studio と Visual Web Developer Express は、ASP.NET MVC 3 インストーラーによってアップグレードされたコンポーネントを共有します。 同じ問題は、Visual Web Developer Express がインストールされていないコンピューターに ASP.NET MVC 3 for Visual Studio をインストールし、後で Visual Web Developer Express をインストールした場合にも適用されます。

ASP.NET MVC 3 RTM での変更点

このセクションでは、RC2 リリース以降の ASP.NET MVC 3 RTM リリースでの変更点とバグ修正について説明します。

変更: jQuery UI のバージョンを 1.8.7 に更新しました

Visual Studio 用の ASP.NET MVC プロジェクト テンプレートが最新バージョンの jQuery UI ライブラリを含むように更新されました。 これらのテンプレートには、jQuery UI で必要な最小限のリソース ファイルのセット (関連付けられた CSS やイメージ ファイルなど) も含まれています。

変更: 既定の ModelMetadataProvider を DataAnnotationsModelMetadataProvider に戻しました

ASP.NET MVC 3 の RC2 リリースでは、パフォーマンスの向上として既存の DataAnnotationsModelMetadataProvider クラスの上にキャッシュを提供した CachedDataAnnotationsMetadataProvider クラスが導入されました。 ただし、この実装ではいくつかのバグが報告されたため、この変更は元に戻され、ASP.NET WebStack で使用できる MVC Futures プロジェクトに移行されました。

修正済み: 空白を含む Razor 式の一部を貼り付けると、反転する

ASP.NET MVC 3 のプレリリース バージョンでは、空白を含む Razor 式の一部を Razor ファイルに貼り付けると、結果として得られる式が反転されます。 たとえば、次の Razor コード ブロックを考えてみます。

@SomeMethod("first param",
100)
@AnotherMethod()

最初のメソッドでテキスト "first param" を選択し、それを 2 番目のメソッドに引数として貼り付けると、結果は次のようになります。

@AnotherMethod(param""first)

正しい動作では、貼り付け操作は次のようになるはずです。

@AnotherMethod("first param")

この問題は、貼り付け操作中に式が正しく保持されるように RTM リリースで修正されました。

修正済み: エディターで開かれている Razor ファイルの名前を変更すると、構文の色付けと IntelliSense が無効になる

Razor ファイルがエディター ウィンドウで開かれている間に、ソリューション エクスプローラーを使用してファイルの名前を変更すると、そのファイルに対する構文の強調表示と IntelliSense が機能を停止します。 これは、名前を変更した後も強調表示と IntelliSense が維持されるように修正されました。

ASP.NET MVC 3 RTM での既知の問題

  • NuGet パッケージ マネージャー コンソールが開いている間に Visual Studio 2010 SP1 Beta を閉じると、Visual Studio がクラッシュし、再起動しようとします。 これは、Visual Studio 2010 SP1 の RTM リリースで修正される予定です。
  • ASP.NET MVC 3 インストーラーは、NuGet パッケージ マネージャーの初期バージョンしかインストールできません。 初期バージョンがインストールされたら、Visual Studio 拡張機能マネージャーを使用して NuGet をインストールして更新できます。 既に NuGet がインストールされている場合は、Visual Studio 拡張機能ギャラリーに移動して、最新バージョンの NuGet に更新します。
  • ソリューション フォルダー内に新しい ASP.NET MVC 3 プロジェクトを作成すると、NullReferenceException エラーが発生します。 これを回避するには、ソリューションのルートに ASP.NET MVC 3 プロジェクトを作成してから、それをソリューション フォルダーに移動します。
  • インストーラーは、完了に以前のバージョンの ASP.NET MVC よりはるかに長い時間がかかることがあります。 これは、Visual Studio 2010 のコンポーネントを更新するためです。
  • ReSharper がインストールされていると、Razor 構文の IntelliSense が機能しません。 ReSharper がインストールされているときに、ASP.NET MVC 3 の Razor IntelliSense サポートを利用したい場合は、現時点でこれらを一緒に使用する方法について説明している、Hadi Hariri のブログにある Razor IntelliSense と ReSharper に関するエントリを参照してください。
  • ASP.NET MVC 3 のベータ版で作成された CCSHTML および VBHTML ビューは、ビルド アクションが正しく設定されていないため、プロジェクトが発行されたときにそのビューの種類が除外されます。 これらのファイルの [ビルド アクション] の値は [コンテンツ] に設定される必要があります。 ASP.NET MVC 3 RTM では、新しいファイルではこの問題が解決されますが、プレリリース バージョンで作成されたプロジェクトの既存のファイルでの設定は修正されません。
  • [ビルド アクション] メニューが開いている [プロパティ] ダイアログ ボックスのスクリーンショット。コンテンツ オプションが選択されています。
  • インストール中、EULA 同意ダイアログ ボックスには、ライセンス条項が意図したよりも小さいウィンドウに表示されます。
  • Razor ビュー (.cshtml ファイル) を編集している場合、Visual Studio の [コントローラーに移動] メニュー項目は使用できず、コード スニペットもありません。
  • Visual Studio がインストールされていないコンピューターに ASP.NET MVC 3 for Visual Web Developer Express をインストールし、後で Visual Studio をインストールした場合は、ASP.NET MVC 3 を再インストールする必要があります。 Visual Studio と Visual Web Developer Express は、ASP.NET MVC 3 インストーラーによってアップグレードされたコンポーネントを共有します。 同じ問題は、Visual Web Developer Express がインストールされていないコンピューターに ASP.NET MVC 3 for Visual Studio をインストールし、後で Visual Web Developer Express をインストールした場合にも適用されます。

ASP.NET MVC 3 での破壊的変更

  • 以前のバージョンの ASP.NET MVC では、いくつかのケースを除き、アクション フィルターが要求ごとに作成されました。 この動作は決して保証された動作ではなく、実装の詳細にすぎず、フィルターのコントラクトでフィルターはステートレスと見なされました。 ASP.NET MVC 3 では、フィルターはより積極的にキャッシュされます。 そのため、インスタンスの状態を誤って格納するカスタム アクション フィルターはすべて壊れている可能性があります。
  • 例外フィルターの実行の順序が、同じ Order 値を持つ例外フィルターに関して変更されました。 ASP.NET MVC 2 以前では、アクション メソッドと同じ Order 値を持つコントローラー上の例外フィルターは、アクション メソッドの例外フィルターの前に実行されました。 これは通常、指定された Order 値なしで例外フィルターが適用される場合です。 ASP.NET MVC 3 では、この順序が、最も限定的な例外ハンドラーが最初に実行されるように反転されました。 以前のバージョンと同様に、Order プロパティが明示的に指定されている場合、フィルターは指定された順序で実行されます。
  • VirtualPathProviderViewEngine 基本クラスに FileExtensions という名前の新しいプロパティが追加されました。 ASP.NET でビューを (名前ではなく) パスで検索すると、この新しいプロパティで指定された一覧に含まれているファイル拡張子を持つビューのみが考慮されます。 これは、Web フォーム ビューのカスタム ファイル拡張子を有効にするためにカスタム ビルド プロバイダーが登録され、そのプロバイダーが名前ではなく完全なパスを使用してこれらのビューを参照するアプリケーションでの破壊的変更です。 これを回避するには、FileExtensions プロパティの値をカスタム ファイル拡張子が含まれるように変更します。
  • IControllerFactory インターフェイスを直接実装するカスタム コントローラー ファクトリの実装では、このリリースでインターフェイスに追加された新しい GetControllerSessionBehavior メソッドの実装を提供する必要があります。 一般に、このインターフェイスを直接実装することはやめ、代わりに DefaultControllerFactory からクラスを派生させることをお勧めします。

ASP.NET MVC 3 RC2 での変更点

このセクションでは、RC リリース以降の ASP.NET MVC 3 RC2 リリースでの変更点 (新機能とバグ修正) について説明します。

プロジェクト テンプレートが jQuery 1.4.4、jQuery Validation 1.7、jQuery UI 1.8.6 を含むように変更されました

ASP.NET MVC 3 用のプロジェクト テンプレートに最新バージョンの jQuery、jQuery Validation、jQuery UI が含まれるようになりました。jQuery UI は、プロジェクト テンプレートへの新しい追加であり、役立つユーザー インターフェイス ウィジェットを提供します。 jQuery UI の詳細については、そのホームページ http://jqueryui.com/ を参照してください。

"AdditionalMetadataAttribute" クラスを追加しました

AdditionalMetadataAttribute クラスを使用すると、モデル プロパティの ModelMetadata.AdditionalValues 辞書を設定できます。

たとえば、あるビュー モデルに、管理者にしか表示してはいけないプロパティがあるとします。 次の例に示すように、キーとして AdminOnly を、値として true を使用して、そのモデルに新しい属性の注釈を付けることができます。

public class ProductViewModel {
    [AdditionalMetadata("AdminOnly", true)]
    public string RefundCode {get; set;}
}

このメタデータは、製品ビュー モデルがレンダリングされるときに、どの表示またはエディター テンプレートでも使用できるようになります。 これらのメタデータ情報の解釈は、アプリケーション開発者に任されています。

ビュー スキャフォールディングを機能強化しました

ビューのスキャフォールディングに使用される T4 テンプレートで、ヘルパー (TextBoxFor など) ではなく、テンプレート ヘルパー メソッド (EditorFor など) の呼び出しが生成されるようになりました。 この変更により、[ビューの追加] ダイアログ ボックスでビューが生成されるときのデータ注釈属性の形式で、モデルでのメタデータのサポートが強化されます。

[ビューの追加] スキャフォールディングには、規約に基づいた、モデルに関する主キー情報の検出と使用の機能強化も含まれています。 たとえば、[ビューの追加] ダイアログ ボックスでは、この情報を使用して、主キーの値が編集可能なフォーム フィールドとしてスキャフォールディングされないようにします。

既定の [テンプレートの編集] や [テンプレートの作成] には、クライアント検証に必要な jQuery スクリプトへの参照が含まれています。

Html.Raw メソッドを追加しました

既定では、Razor ビュー エンジンではすべての値を HTML エンコードします。 たとえば、次のコード スニペットでは、greeting 変数内に HTML をエンコードして、それが <strong>Hello World!</strong> としてページ内に表示されるようにします。

@{
  string greeting = "<strong>Hello World!</strong>";
}

<p>@greeting</p>

新しい Html.Raw メソッドは、コンテンツが安全であることがわかっているときにエンコードされていない HTML を表示するための簡単な方法を提供します。 次の例では、同じ文字列を表示しますが、文字列がマークアップとしてレンダリングされます。

@{
  string greeting = "<strong>Hello World!</strong>";
}

<p>@Html.Raw(greeting)</p>

"Controller.ViewModel" プロパティと "View" プロパティの名前を "ViewBag" に変更しました

以前は、ControllerViewModel プロパティは、ビューの View プロパティに対応していました。 これらのプロパティはどちらも、動的プロパティ アクセサー構文を使用して ViewDataDictionary オブジェクトの値にアクセスするための方法を提供します。 混乱を避け、一貫性を向上させるために、両方のプロパティの名前を同じものに変更しました。

"ControllerSessionStateAttribute" クラスの名前を "SessionStateAttribute" に変更しました

ControllerSessionStateAttribute クラスは、ASP.NET MVC 3 の RC リリースで導入されました。 このプロパティの名前がより簡潔になるように変更されました。

RemoteAttribute の "Fields" プロパティの名前を "AdditionalFields" に変更しました

RemoteAttribute クラスの Fields プロパティのために、ユーザーの間で少し混乱が発生しました。 このプロパティの名前を AdditionalFields に変更することにより、その意図が明確になります。

"SkipRequestValidationAttribute" の名前を "AllowHtmlAttribute" に変更しました

SkipRequestValidationAttribute 属性の名前が、その意図された使用方法をより適切に表すために AllowHtmlAttribute に変更されました。

"Html.ValidationMessage" メソッドを最初の有用なエラー メッセージを表示するように変更しました

Html.ValidationMessage メソッドが、単純に最初のエラーを表示するのではなく、最初の有用なエラー メッセージを表示するように修正されました。

モデル バインド中に、ModelState 辞書には、そのモデル自体 (それが IValidatableObject を実装している場合) から、プロパティに適用された検証属性から、プロパティへのアクセス中にスローされた例外からを含む、プロパティに関するエラー メッセージが含まれた複数のソースからのデータを設定できます。

例外を含むモデル状態エントリは一般にエンド ユーザーへの表示を目的としていないため、Html.ValidationMessage メソッドで検証メッセージを表示するとき、このエントリはスキップされます。 代わりに、このメソッドでは例外に関連付けられていない最初の検証メッセージを探し、そのメッセージを表示します。 このようなメッセージが見つからない場合、既定では、最初の例外に関連付けられている一般的なエラー メッセージが表示されます。

@model 宣言をドキュメントに空白を追加しないように修正しました

以前のリリースでは、ビューの上部にある @model 宣言により、レンダリングされた HTML 出力に空白行が追加されました。 これが、この宣言で空白が導入されないように修正されました。

ビュー エンジンにエンジン固有のファイル名をサポートするための "FileExtensions" プロパティを追加しました

ビュー エンジンは、次の例に示すように、明示的なビュー パスを使用してビューを返すことができます。

return View("~/views/home/index.cshtml");

最初のビュー エンジンは、常にビューをレンダリングしようとします。 既定では、Web Forms ビュー エンジンは最初のビュー エンジンです。Web Forms エンジンは Razor ビューをレンダリングできないため、エラーが発生します。 ビュー エンジンに、どのファイル拡張子をサポートするかを指定するために使用される FileExtensions プロパティが追加されました。 このプロパティは、ASP.NET で、ビュー エンジンがファイルをレンダリングできるかどうかを判定するときにチェックされます。 これは破壊的変更であり、詳細情報は、このドキュメントの破壊的変更のセクションに含まれています。

"LabelFor" ヘルパーを "for" 属性の正しい値を出力するように修正しました

LabelFor メソッドで、input 要素の ID ではなく、その name 属性と一致する for 属性をレンダリングしていたバグが修正されました。 W3C に従って、for 属性は input 要素の ID と一致する必要があります。

"RenderAction" メソッドをモデル バインド中に明示的な値を優先するように修正しました

以前のバージョンでは、子アクション内のモデル バインド中に現在のフォーム値が優先され、RenderAction メソッドに渡された明示的な値は無視されました。 この修正により、モデル バインド中に明示的な値が確実に優先されるようになります。

ASP.NET MVC 3 RC2 での破壊的変更

  • 以前のバージョンの ASP.NET MVC では、いくつかのケースを除き、アクション フィルターが要求ごとに作成されました。 この動作は決して保証された動作ではなく、実装の詳細にすぎず、フィルターのコントラクトでフィルターはステートレスと見なされました。 ASP.NET MVC 3 では、フィルターはより積極的にキャッシュされます。 そのため、インスタンスの状態を誤って格納するカスタム アクション フィルターはすべて壊れている可能性があります。
  • 例外フィルターの実行の順序が、同じ Order 値を持つ例外フィルターに関して変更されました。 ASP.NET MVC 2 以前では、アクション メソッドと同じ Order 値を持つコントローラー上の例外フィルターは、アクション メソッドの例外フィルターの前に実行されました。 これは通常、指定された Order 値なしで例外フィルターが適用された場合です。 ASP.NET MVC 3 では、この順序が、最も限定的な例外ハンドラーが最初に実行されるように反転されました。 以前のバージョンと同様に、Order プロパティが明示的に指定されている場合、フィルターは指定された順序で実行されます。
  • VirtualPathProviderViewEngine 基本クラスに FileExtensions という名前の新しいプロパティが追加されました。 ASP.NET でビューを (名前ではなく) パスで検索すると、この新しいプロパティで指定された一覧に含まれているファイル拡張子を持つビューのみが考慮されます。 これは、Web フォーム ビューのカスタム ファイル拡張子を有効にするためにカスタム ビルド プロバイダーが登録され、そのプロバイダーが名前ではなく完全なパスを使用してこれらのビューを参照するアプリケーションでの破壊的変更です。 これを回避するには、FileExtensions プロパティの値をカスタム ファイル拡張子が含まれるように変更します。
  • IControllerFactory インターフェイスを直接実装するカスタム コントローラー ファクトリの実装では、このリリースでインターフェイスに追加された新しい GetControllerSessionBehavior メソッドの実装を提供する必要があります。 一般に、このインターフェイスを直接実装することはやめ、代わりに DefaultControllerFactory からクラスを派生させることをお勧めします。

ASP.NET MVC 3 RC2 での既知の問題

  • ASP.NET MVC 3 インストーラーは、NuGet パッケージ マネージャーの初期バージョンしかインストールできません。 初期バージョンがインストールされたら、Visual Studio 拡張機能マネージャーを使用して NuGet をインストールして更新できます。 既に NuGet がインストールされている場合は、Visual Studio 拡張機能ギャラリーに移動して、最新バージョンの NuGet に更新します。
  • ソリューション フォルダー内に新しい ASP.NET MVC 3 プロジェクトを作成すると、NullReferenceException エラーが発生します。 これを回避するには、ソリューションのルートに ASP.NET MVC 3 プロジェクトを作成してから、それをソリューション フォルダーに移動します。
  • インストーラーは、完了に以前のバージョンの ASP.NET MVC よりはるかに長い時間がかかることがあります。 これは、Visual Studio 2010 のコンポーネントを更新するためです。
  • ReSharper がインストールされていると、Razor 構文の IntelliSense が機能しません。 ReSharper がインストールされているときに、ASP.NET MVC 3 RC2 の Razor IntelliSense サポートを利用したい場合は、現時点でこれらを一緒に使用する方法について説明している、Hadi Hariri のブログにある Razor IntelliSense と ReSharper に関するエントリを参照してください。
  • ASP.NET MVC 3 のベータ版で作成された CSHTML および VBHTML ビューは、ビルド アクションが正しく設定されていないため、プロジェクトが発行されたときにそのビューの種類が除外されます。 これらのファイルの [ビルド アクション] の値は [コンテンツ] に設定される必要があります。 ASP.NET MVC 3 RC2 では、新しいファイルではこの問題が解決されますが、ベータ版で作成されたプロジェクトの既存のファイルでの設定は修正されません。[プロパティ] ダイアログ ボックスのスクリーンショット。[ビルド アクション] メニューが開き、コンテンツ オプションが選択されています。
  • インストール中、EULA 同意ダイアログ ボックスには、ライセンス条項が意図したよりも小さいウィンドウに表示されます。
  • Razor ビュー (.cshtml ファイル) を編集している場合、Visual Studio の [コントローラーに移動] メニュー項目は使用できず、コード スニペットもありません。
  • Visual Studio がインストールされていないコンピューターに ASP.NET MVC 3 for Visual Web Developer Express をインストールし、後で Visual Studio をインストールした場合は、ASP.NET MVC 3 を再インストールする必要があります。 Visual Studio と Visual Web Developer Express は、ASP.NET MVC 3 インストーラーによってアップグレードされたコンポーネントを共有します。 同じ問題は、Visual Web Developer Express がインストールされていないコンピューターに ASP.NET MVC 3 for Visual Studio をインストールし、後で Visual Web Developer Express をインストールした場合にも適用されます。
  • ASP.NET MVC 3 RC 2 をインストールしても、既にインストールされている NuGet は更新されません。 NuGet をアップグレードするには、Visual Studio 拡張機能マネージャーに移動すると、それが使用可能な更新プログラムとして表示されます。 そこから NuGet を最新リリースにアップグレードできます。

ASP.NET MVC 3 リリース候補

ASP.NET MVC リリース候補は、2010 年 11 月 9 日にリリースされました。

ASP.NET MVC 3 RC での新機能

このセクションでは、ベータ版リリース以降の ASP.NET MVC 3 RC リリースで導入された機能について説明します。

NuGet パッケージ マネージャー

ASP.NET MVC 3 には、Visual Studio プロジェクトにライブラリやツールを追加するための統合パッケージ管理ツールである NuGet パッケージ マネージャー (以前の NuPack) が含まれています。 このツールでは、開発者がライブラリをソース ツリーに追加するために現在実行している手順が自動化されます。

NuGet はコマンド ライン ツールとして、Visual Studio 2010 内の統合コンソール ウィンドウとして、Visual Studio コンテキスト メニューから、さらには一連の PowerShell コマンドレットとして操作できます。

NuGet の詳細については、NuGet のドキュメントを参照してください。

[新しいプロジェクト] ダイアログ ボックスを機能強化しました

新しいプロジェクトを作成する場合、[新しいプロジェクト] ダイアログ ボックスでは、ASP.NET MVC プロジェクトの種類だけでなく、ビュー エンジンを指定できるようになりました。

[新しいプロジェクト] ダイアログ ボックスのスクリーンショット。ビュー エンジン メニューが開き、Razor が選択されています。

このダイアログ ボックスに一覧表示されるテンプレートとビュー エンジンの一覧を変更するためのサポートがこのリリースに含まれています。

既定のテンプレートは次のとおりです。

空白。 ASP.NET MVC プロジェクトの既定のディレクトリ構造、既定の ASP.NET MVC スタイルが含まれている Site.css ファイル、既定の JavaScript ファイルが含まれているスクリプト ディレクトリを含む、ASP.NET MVC プロジェクト用の最小限のファイル セットが含まれています。

インターネット アプリケーション。 ASP.NET MVC でメンバーシップ プロバイダーを使用する方法を示すサンプル機能が含まれています。

このダイアログ ボックスに表示されるプロジェクト テンプレートの一覧は、Windows レジストリで指定されます。

セッションレス コントローラー

新しい ControllerSessionStateAttribute では、System.Web.SessionState.SessionStateBehavior 列挙値を指定することによって、コントローラーのセッション状態の動作をより詳細に制御できます。

次の例は、コントローラーへのすべての要求のセッション状態を無効にする方法を示しています。

[ControllerSessionState(SessionStateBehavior.Disabled)]
public class CoolController : Controller {
    public ActionResult Index() {
        object o = Session["Key"]; // Causes an exception.

    }
}

次の例は、コントローラーへのすべての要求の読み取り専用セッション状態を設定する方法を示しています。

[ControllerSessionState(SessionStateBehavior.ReadOnly)]
public class CoolController : Controller {
    public ActionResult Index() {
    Session["Key"] = "value"; // Value is not available in
    the next request
    }
}

新しい検証属性

CompareAttribute

新しい CompareAttribute 検証属性を使用すると、あるモデルの 2 つの異なるプロパティの値を比較できます。 次の例では、ComparePassword プロパティが有効になるには Password フィールドと一致している必要があります。

public class User {
    [Required]

    public string Password { get; set; }
    [Required, Compare("Password")]
    public string ComparePassword { get; set; }
}

RemoteAttribute

新しい RemoteAttribute 検証属性では、jQuery Validation プラグインのリモート検証コントロールを利用します。これは、クライアント側の検証で、実際の検証ロジックを実行するサーバー上のメソッドを呼び出せるようにします。

次の例では、UserName プロパティに RemoteAttribute が適用されています。 このプロパティを編集ビューで編集しているとき、このフィールドを検証するために、クライアント検証によって 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";
    }
}

既定では、属性が適用されるプロパティ名は、クエリ文字列パラメーターとしてアクション メソッドに送信されます。

"LabelFor" および "LabelForModel" メソッドの新しいオーバーロード

ラベル テキストを指定できる、LabelFor および LabelForModel メソッドの新しいオーバーロードが追加されました。 次の例は、これらのオーバーロードを使用する方法を示しています。

@Html.LabelFor(m => m.PropertyName,
"Label Text");
@Html.LabelForModel("Label Text");

子アクションの出力キャッシュ

OutputCacheAttribute では、Html.RenderAction または Html.Action ヘルパー メソッドを使用して呼び出される子アクションの出力キャッシュがサポートされます。 次の例は、別のアクションを呼び出すビューを示しています。

Hi there. The uncached time is:
@DateTime.Now
The cached time is: @Html.Action("GetDate")

GetDate アクションには、OutputCacheAttribute の注釈が付けられています。

[OutputCache(Duration = 100,
VaryByParam = "none")]
public string GetDate() {
    return DateTime.Now.ToString();
}

このコードが実行されると、Html.Action("GetDate") の呼び出しの結果が 100 秒間キャッシュされます。

[ビューの追加] ダイアログ ボックスの機能強化

厳密に型指定されたビューを追加する場合、[ビューの追加] ダイアログ ボックスでは、以前のリリースより多くの適用できない型 (多数のコア .NET Framework 型など) が除外されるようになりました。 また、この一覧が完全修飾型名ではなく、クラス名で並べ替えられるようになったため、型を見つけやすくなりました。 たとえば、型名が次の例のように表示されるようになりました。

ClassName (namespace)

以前のリリースでは、これは次のように表示されていました。

Namespace.ClassName

きめ細かい要求の検証

ValidateInputAttributeExclude プロパティは存在しなくなりました。 代わりに、モデル バインド中にモデルの特定のプロパティに対して要求の検証がスキップされるようにするには、新しい SkipRequestValidationAttribute を使用します。

たとえば、ブログ投稿を編集するためにアクション メソッドが使用されるとします。

[HttpPost]
public ActionResult Edit(BlogPostViewModel post) {
    // Save the post in the database
}

次の例は、ブログ投稿のビュー モデルを示しています。

public class BlogPostViewModel {
    public int Id {get; set;}

    public string Subject {get; set;}

    public string Description {get; set;}
}

ユーザーが Description プロパティの何らかのマークアップを送信すると、要求の検証のためにモデル バインドは失敗します。 モデル バインド中にブログ投稿の Description に対する要求の検証を無効にするには、次の例に示すように、そのプロパティに SkipRequpestValidationAttribute を適用します。

public class BlogPostViewModel {
    public int Id {get; set;}

    public string Subject {get; set;}

    [SkipRequestValidation]

    public string Description {get; set;}
}

あるいは、モデルのすべてのプロパティに対する要求の検証を無効にするには、そのアクション メソッドに値が falseValidateInputAttribute を適用します。

[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(BlogPostViewModel post) {
    // Save the post in the database
}

ASP.NET MVC 3 RC での破壊的変更

  • 例外フィルターの実行の順序が、同じ Order 値を持つ例外フィルターに関して変更されました。 ASP.NET MVC 2 以前では、アクション メソッドと同じ Order 値を持つコントローラー上の例外フィルターは、アクション メソッドの例外フィルターの前に実行されました。 これは通常、指定された Order 値なしで例外フィルターが適用された場合です。 ASP.NET MVC 3 では、この順序が、最も限定的な例外ハンドラーが最初に実行されるように反転されました。 以前のバージョンと同様に、Order プロパティが明示的に指定されている場合、フィルターは指定された順序で実行されます。
  • VirtualPathProviderViewEngine 基本クラスに FileExtensions という名前の新しいプロパティを追加しました。 ビューを (名前ではなく) パスで検索すると、この新しいプロパティで指定された一覧に含まれているファイル拡張子を持つビューのみが考慮されます。 これは、Web フォーム ビューのカスタム ファイル拡張子を有効にするためにカスタム ビルド プロバイダーを登録し、名前ではなく完全なパスを使用してこれらのビューを参照しているアプリケーションでの破壊的変更です。 これを回避するには、FileExtensions プロパティの値をカスタム ファイル拡張子が含まれるように変更します。

ASP.NET MVC 3 RC での既知の問題

  • インストーラーは、Visual Studio 2010 のコンポーネントを更新するため、完了に以前のバージョンの ASP.NET MVC よりはるかに長い時間がかかることがあります。
  • [ビューの追加] スキャフォールディングで厳密に型指定されたビューを選択すると、書き込み専用プロパティがスキャフォールディングされます。 これらは、常にスキャフォールディングによって無視される必要があります。 また、[ビューの追加] ダイアログで "編集" または "作成" ビューを生成するときも、読み取り専用プロパティがスキャフォールディングされます。 読み取り専用プロパティは、表示およびリスト ビューに対してのみスキャフォールディングされる必要があります。
  • ASP.NET MVC 3 が Async CTP と並行してインストールされていると、デバッグが機能しません。 ASP.NET MVC 3 を Async CTP と並行してインストールすることはできません。 デバッグを修復するには、Async CTP をアンインストールしてください。 詳細については、ASP.NET MVC 3 RC のすべての部分のアンインストールに関するこのブログ投稿を参照してください。
  • Resharper がインストールされていると、Razor IntelliSense が機能しません。 ReSharper がインストールされているときに、ASP.NET MVC 3 RC の Razor IntelliSense サポートを利用したい場合は、現時点でこれらを一緒に使用する方法について説明している、JetBrains のこのブログ投稿を参照してください。
  • ASP.NET MVC 3 のベータ版で作成された CSHTML および VBHTML ビューは、ビルド アクションが正しく設定されていないため、発行から除外されます。 これらのファイルの [ビルド アクション] は [コンテンツ] に設定される必要があります。 ASP.NET MVC 3 RC では、新しいファイルではこの問題が解決されますが、ベータ版で作成されたプロジェクトの既存のファイルでの設定は修正されません。
  • インストーラーは、Visual Studio 2010 のコンポーネントを更新するため、完了に以前のバージョンの ASP.NET MVC よりはるかに長い時間がかかることがあります。
  • [ビューの追加] スキャフォールディングで "編集" の厳密に型指定されたビューを選択すると、読み取り専用プロパティがスキャフォールディングされます。 同様に、"表示" ビューに対しては書き込み専用プロパティがスキャフォールディングされます。
  • インストール中、EULA 同意ダイアログ ボックスには、ライセンス条項が意図したよりも小さいウィンドウに表示されます。
  • Visual Studio Async CTP をインストールすると、ASP.NET MVC 3 のツール インストールの一部として含まれている Razor リリースとの競合が発生します。 Visual Studio Async CTP と Razor リリースの両方を同じマシンにインストールしようとしないでください。
  • Razor ビュー (.cshtml ファイル) を編集している場合、Visual Studio の [コントローラーに移動] メニュー項目は使用できず、コード スニペットもありません。

ASP.NET MVC 3 ベータ版

ASP.NET MVC 3 ベータ版は、2010 年 10 月 6 日にリリースされました。 次のノートはベータ版リリースに固有のものであり、上記の「ASP.NET MVC 3 リリース候補」のセクションで参照されているすべての更新または変更に従います。

ASP.NET MVC 3 ベータ版での新機能

このセクションでは、ASP.NET MVC 3 ベータ版リリースで導入された機能について説明します。

NuGet パッケージ マネージャー

ASP.NET MVC 3 には、Visual Studio プロジェクトにライブラリやツールを追加するための統合パッケージ管理ツールである NuGet パッケージ マネージャーが含まれています。 ほとんどの場合は、それにより、開発者がライブラリをソース ツリーに追加するために現在実行している手順が自動化されます。

NuGet はコマンド ライン ツールとして、Visual Studio 2010 内の統合コンソール ウィンドウとして、Visual Studio コンテキスト メニューから、さらには一連の PowerShell コマンドレットとして操作できます。

NuGet の詳細については、NuGet のドキュメントを参照してください。

[新しいプロジェクト] ダイアログ ボックスを機能強化しました

新しいプロジェクトを作成する場合、[新しいプロジェクト] ダイアログ ボックスでは、ASP.NET MVC プロジェクトの種類だけでなく、ビュー エンジンを指定できるようになりました。

[新しいプロジェクト] ダイアログ ボックスのスクリーンショット。Razor はビュー エンジン メニューから選択されます。

このダイアログ ボックスに一覧表示されるテンプレートとビュー エンジンの一覧を変更するためのサポートは、このリリースには含まれていません。

既定のテンプレートは次のとおりです。

空白。 ASP.NET MVC プロジェクトの既定のディレクトリ構造、既定の ASP.NET MVC スタイルが含まれている小さな Site.css ファイル、既定の JavaScript ファイルが含まれているスクリプト ディレクトリを含む、ASP.NET MVC プロジェクト用の最小限のファイル セットが含まれています。

インターネット アプリケーション。 ASP.NET MVC 内でメンバーシップ プロバイダーを使用する方法を示すサンプル機能が含まれています。

Razor ビューの厳密に型指定されたモデルを指定するための簡略化された方法

厳密に型指定された Razor ビューのモデルの型を指定するための方法が、CSHTML ビューの新しい @model ディレクティブと VBHTML ビューの @ModelType ディレクティブを使用して簡略化されました。 以前のバージョンの ASP.NET MVC では、Razor ビューの厳密に型指定されたモデルを次のように指定します。

@inherits System.Web.Mvc.WebViewPage

このリリースでは、次の構文を使用できます。

@model MyModelNamespace.MyModelType

新しい ASP.NET Web ページ ヘルパー メソッドのサポート

新しい ASP.NET Web ページ テクノロジには、一般的に使用される機能をビューやコントローラーに追加するのに役立つ一連のヘルパー メソッドが含まれています。 ASP.NET MVC 3 では、これらのヘルパー メソッドのコントローラーやビュー内での使用がサポートされます (必要に応じて)。 これらのメソッドは、System.Web.Helpers アセンブリに含まれています。 次の表は、いくつかの ASP.NET Web ページ ヘルパー メソッドの一覧を示しています。

ヘルパー 説明
グラフ ビュー内にグラフをレンダリングします。 Chart.ToWebImage、Chart.Save、Chart.Write などのメソッドが含まれています。
暗号 ハッシュ アルゴリズムを使用して、適切にソルト化およびハッシュ化されたパスワードを作成します。
WebGrid オブジェクトのコレクション (通常はデータベースからのデータ) をグリッドとしてレンダリングします。 ページングと並べ替えがサポートされます。
WebImage イメージをレンダリングします。
WebMail 電子メールを送信します。

ヘルパーと基本的な構文が一覧表示されたクイック リファレンス トピックは、次の URL で ASP.NET Razor 構文のドキュメントの一部として入手できます。

https://www.asp.net/webmatrix/tutorials/asp-net-web-pages-api-reference

依存関係の挿入に対する追加のサポート

ASP.NET MVC 3 Preview 1 リリースに基づいて、現在のリリースには、2 つの新しいサービスと 4 つの既存のサービスに対する追加のサポートと、依存関係の解決と Common Service Locator に対するサポートの強化が含まれています。

きめ細かいコントローラーのインスタンス化のための新しい IControllerActivator インターフェイス

新しい IControllerActivator インターフェイスでは、依存関係の挿入を使用して、コントローラーがインスタンス化される方法をよりきめ細かく制御できます。 次の例は、 インターフェイスを示しています。

namespace System.Web.Mvc {
    using System.Web.Routing;

    public interface IControllerActivator {
        IController Create(RequestContext requestContext, Type controllerType);
    }
}

これをコントローラー ファクトリの役割と対比してください。 コントローラー ファクトリは、コントローラーの種類の検索と、そのコントローラーの種類のインスタンスのインスタンス化の両方の役割を果たす IControllerFactory インターフェイスの実装です。

コントローラー アクティベーターは、コントローラーの種類のインスタンスのインスタンス化のみの役割を果たします。 これらは、コントローラーの種類の検索を実行しません。 適切なコントローラーの種類を検索したら、コントローラー ファクトリは IControllerActivator のインスタンスに委任して、そのコントローラーの実際のインスタンス化を処理する必要があります。

DefaultControllerFactory クラスには、IControllerFactory インスタンスを受け入れる新しいコンストラクターがあります。 これにより、コントローラーの種類の検索という既定の動作をオーバーライドしなくても、依存関係の挿入を適用してコントローラー作成のこの側面を管理できます。

IServiceLocator インターフェイスが IDependencyResolver に置き換えられました

コミュニティ フィードバックに基づいて、ASP.NET MVC 3 ベータ版リリースでは、IServiceLocator インターフェイスの使用が ASP.NET MVC のニーズに固有のスリム化された IDependencyResolver インターフェイスに置き換えられました。 次の例は、新しいインターフェイスを示しています。

namespace System.Web.Mvc {
    using System.Collections.Generic;

    public interface IDependencyResolver {
        object GetService(Type serviceType);
        IEnumerable<object> GetServices(Type serviceType);
    }
}

この変更の一部として、ServiceLocator クラスも DependencyResolver クラスに置き換えられました。 依存関係リゾルバーの登録は、以前のバージョンの ASP.NET MVC と同様です。

DependencyResolver.SetResolver(myResolver);

このインターフェイスの実装では、単純に基になる依存関係挿入コンテナーに委任して、要求された種類の登録済みサービスを提供する必要があります。

要求された種類の登録済みサービスがない場合、ASP.NET MVC ではこのインターフェイスの実装を予測して、GetService からは null を返し、GetServices からは空のコレクションを返します。

新しい DependencyResolver クラスを使用すると、新しい IDependencyResolver インターフェイスまたは Common Service Locator インターフェイス (IServiceLocator) のどちらかを実装するクラスを登録できます。 Common Service Locator の詳細については、GitHub 上の CommonServiceLocator を参照してください。

きめ細かいビュー ページのインスタンス化のための新しい IViewActivator インターフェイス

新しい IViewPageActivator インターフェイスでは、依存関係の挿入を使用して、ビュー ページがインスタンス化される方法をよりきめ細かく制御できます。 これは、WebFormView インスタンスと RazorView インスタンスの両方に適用されます。 次の例は、新しいインターフェイスを示しています。

namespace System.Web.Mvc {
    public interface IViewPageActivator {
        object Create(ControllerContext controllerContext, Type type);
    }
}

これらのクラスでは、IViewPageActivator コンストラクター引数を受け入れるようになりました。これにより、依存関係の挿入を使用して、ViewPage、ViewUserControl、WebViewPage の各種類がインスタンス化される方法を制御できます。

既存のサービスに対する新しい依存関係リゾルバーのサポート

新しいリリースには、次のサービスに対する依存関係の解決のサポートが含まれています。

  • モデル検証プロバイダー。 依存関係リゾルバーでは、ModelValidatorProvider を実装するクラスを登録できます。システムではそれらを使用して、クライアント側とサーバー側の検証をサポートします。
  • モデル メタデータ プロバイダー。 依存関係リゾルバーでは、ModelMetadataProvider を実装する 1 つのクラスを登録できます。システムではそれを使用して、テンプレート システムと検証システムのメタデータを提供します。
  • 値プロバイダー。 依存関係リゾルバーでは、ValueProviderFactory を実装するクラスを登録できます。システムではそれらを使用して、モデル バインド中にコントローラーによって消費される値プロバイダーを作成します。
  • モデル バインダー。 依存関係リゾルバーでは、IModelBinderProvider を実装するクラスを登録できます。システムではそれらを使用して、モデル バインド システムによって消費されるモデル バインダーを作成します。

Unobtrusive jQuery ベースの Ajax に対する新しいサポート

ASP.NET MVC には、次のような Ajax ヘルパー メソッドが含まれています。

  • Ajax.ActionLink
  • Ajax.RouteLink
  • Ajax.BeginForm
  • Ajax.BeginRouteForm

これらのメソッドでは、JavaScript を使用して、完全なポストバックを使用する代わりにサーバー上でアクション メソッドを呼び出します。 この機能が、控えめな方法で jQuery を利用するように更新されました。 インライン クライアント スクリプトを侵入的に出力するのではなく、これらのヘルパー メソッドでは、data-ajax プレフィックスを使用して HTML5 属性を出力することにより、その動作をマークアップから切り離します。 その後、適切な JavaScript ファイルを参照することによって、マークアップに動作が適用されます。 次の JavaScript ファイルが参照されていることを確認してください。

  • jquery-1.4.1.js
  • jquery.unobtrusive.ajax.js

この機能は、ASP.NET MVC 3 の新しいプロジェクト テンプレート内の Web.config ファイルで既定で有効になっていますが、既存のプロジェクトでは既定で無効になっています。 詳細については、このドキュメントの後の方にあるクライアント検証と控えめな JavaScript のためのアプリケーション全体のフラグの追加に関するページを参照してください。

Unobtrusive jQuery Validation に対する新しいサポート

既定では、ASP.NET MVC 3 ベータ版では、クライアント側の検証を実行するために控えめな方法で jQuery Validation を使用します。 控えめなクライアント検証を有効にするには、ビュー内から次のような呼び出しを行います。

Html.EnableClientValidation();

これには、ViewContext.UnobtrusiveJavaScriptEnabled プロパティが true に設定されている必要があります。これは、次の呼び出しによって行うことができます。

Html.EnableUnobtrusiveJavaScript();

また、次の JavaScript ファイルが参照されていることも確認してください。

  • jquery-1.4.1.js
  • jquery.validate.js
  • jquery.validate.unobtrusive.js

この機能は、ASP.NET MVC 3 の新しいプロジェクト テンプレート内の Web.config ファイルで既定で有効になっていますが、既存のプロジェクトでは既定で無効になっています。 詳細については、このドキュメントの後の方にある「クライアント検証と控えめな JavaScript のための新しいアプリケーション全体のフラグ」を参照してください。

クライアント検証と控えめな JavaScript のための新しいアプリケーション全体のフラグ

クライアント検証と控えめな JavaScript は、次の例に示すように、HtmlHelper クラスの静的メンバーを使用してグローバルに有効または無効にすることができます。

HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

既定のプロジェクト テンプレートでは、控えめな JavaScript を既定で有効にします。 また、次の設定を使用して、これらの機能をアプリケーションのルート Web.config ファイルで有効または無効にすることもできます。

<configuration>
        <appSettings>
            <add key="ClientValidationEnabled" value="true"/>
            <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
        </appSettings>
    </configuration>

これらの機能は既定で有効にすることができるため、次の例に示すように、既定の設定をオーバーライドできる新しいオーバーロードが HtmlHelper クラスに導入されました。

public void EnableClientValidation();
public void EnableClientValidation(bool enabled);
public void EnableUnobtrusiveJavaScript();
public void EnableUnobtrusiveJavaScript(bool enabled);

下位互換性のために、これらの機能は、どちらも既定で無効になっています。

ビューの実行前に実行されるコードに対する新しいサポート

_viewstart.cshtml (または _viewstart.vbhtml) という名前のファイルを Views ディレクトリに配置し、そのディレクトリとそのサブディレクトリ内の複数のビューの間で共有されるコードをそこに追加できるようになりました。 たとえば、~/Views フォルダー内の _viewstart.cshtml ページに次のコードを配置したとします。

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

これにより、Views フォルダーとそのすべてのサブフォルダー内のすべてのビューのレイアウト ページが再帰的に設定されます。 ビューがレンダリングされているとき、_viewstart.cshtml ファイル内のコードは、ビュー コードが実行される前に実行されます。 _viewstart.cshtml のコードは、そのフォルダー内のすべてのビューに適用されます。

既定では、_viewstart.cshtml ファイル内のコードは、すべてのサブフォルダー内のビューにも適用されます。 ただし、個々のサブフォルダーには _viewstart.cshtml ファイルの独自のバージョンを配置できます。その場合は、ローカル バージョンが優先されます。 たとえば、HomeController のすべてのビューに共通するコードを実行するには、~/Views/Home フォルダーに _viewstart.cshtml ファイルを配置します。

VBHTML Razor 構文に対する新しいサポート

以前の ASP.NET MVC プレビューには、C# に基づいて Razor 構文を使用するビューのサポートが含まれていました。 これらのビューでは、.cshtml ファイル拡張子を使用します。 Razor をサポートするための継続的な作業の一部として、ASP.NET MVC 3 ベータ版では、.vbhtml ファイル拡張子を使用する Visual Basic での Razor 構文のサポートが導入されています。

VBHTML ページでの Visual Basic 構文の使用の概要については、次の URL にあるチュートリアルを参照してください。

https://www.asp.net/webmatrix/tutorials/asp-net-web-pages-visual-basic

ValidateInputAttribute に対するよりきめ細かい制御

ASP.NET MVC には、常に ValidateInputAttribute クラスが含まれていました。これは、コア ASP.NET 要求検証インフラストラクチャを呼び出して、受信要求に悪意がある可能性のある入力が含まれていないことを確認します。 既定では、入力の検証が有効になっています。 要求の検証は、次の例に示すように、ValidateInputAttribute 属性を使用して無効にすることができます。

[ValidateInput(false)]
public ActionResult SomeAction() {
    return View();
}

ただし、多くの Web アプリケーションには HTML の許可が必要な個々のフォーム フィールドがある一方、残りのフィールドでは許可してはいけません。 ValidateInputAttribute クラスでは、要求の検証に含めてはいけないフィールドの一覧を指定できるようになりました。

たとえば、ブログ エンジンを開発している場合は、Body および Summary フィールドでマークアップを許可することもできます。 これらのフィールドは、それぞれにプロパティ名に対応する名前属性 ("Body" と "Summary") を持つ 2 つの入力要素で表されることがあります。 これらのフィールドに対してのみ要求の検証を無効にするには、次の例に示すように、それらの名前 (コンマ区切り) を ValidateInput クラスの Exclude プロパティで指定します。

[ValidateInput(true, Exclude="Body, Summary")]
public ActionResult About() {
    return View();
}

ヘルパーは、匿名オブジェクトを使用して指定された HTML 属性名のアンダースコアをハイフンに変換します

ヘルパー メソッドでは、次の例に示すように、匿名オブジェクトを使用して属性名と値のペアを指定できます。

Html.TextBox("Name", "Value", new {title = "Title"})

ASP.NET のプロパティ名にはハイフンを使用できないため、このアプローチでは属性名にハイフンを使用できません。 ただし、ハイフンはカスタム HTML5 属性では重要です。たとえば、HTML5 では "data-" プレフィックスが使用されます。

同時に、アンダースコアは HTML の属性名に使用できませんが、プロパティ名内では有効です。 そのため、匿名オブジェクトを使用して属性を指定したとき、属性名にアンダースコアが含まれている場合、ヘルパー メソッドではそのアンダースコアをハイフンに変換します。 たとえば、次のヘルパー構文ではアンダースコアが使用されています。

Html.TextBox("Name", "Value", new {data_required = "true"})

前の例では、ヘルパーが実行されると、次のマークアップがレンダリングされます。

<input data-required="true" id="Name" name="Name"
       type="textbox" value="Value" />

バグの修正

EditorFor および DisplayFor テンプレート ヘルパーの既定のオブジェクト テンプレートで、DisplayAttribute.Order プロパティで指定された順序がサポートされるようになりました。 (以前のバージョンでは、Order 設定は使用されませんでした)。

クライアント検証で、検証属性が適用されているオーバーライドされたプロパティの検証がサポートされるようになりました。

JsonValueProviderFactory が既定で登録されるようになりました。

重大な変更

例外フィルターの実行の順序が、同じ Order 値を持つ例外フィルターに関して変更されました。 ASP.NET MVC 2 以前では、アクション メソッドと同じ Order 値を持つコントローラー上の例外フィルターは、アクション メソッドの例外フィルターの前に実行されました。 これは通常、指定された Order 値なしで例外フィルターが適用された場合です。 ASP.NET MVC 3 では、この順序が、最も限定的な例外ハンドラーが最初に実行されるように反転されました。 以前のバージョンと同様に、Order プロパティが明示的に指定されている場合、フィルターは指定された順序で実行されます。

既知の問題

インストール中、EULA 同意ダイアログ ボックスには、ライセンス条項が意図したよりも小さいウィンドウに表示されます。

Razor ビューには、IntelliSense のサポートも構文の強調表示もありません。 Visual Studio での Razor 構文のサポートが今後のリリースの一部として含まれることが予測されます。

Razor ビュー (CSHTML ファイル) を編集している場合、Visual Studio の [コントローラーに移動] メニュー項目は使用できず、コード スニペットもありません。

@model 構文を使用して厳密に型指定された CSHTML ビューを指定するときは、型の言語固有のショートカットが認識されません。 たとえば、@model int は機能しませんが、@model Int32 は機能します。 このバグを回避するには、モデルの型を指定するときに実際の型名を使用します。

@model 構文を使用して厳密に型指定された CSHTML ビューを指定する (または @ModelType を使用して厳密に型指定された VBHTML ビューを指定する) ときは、null 許容型と配列の宣言がサポートされません。 たとえば、@model int? はサポートされません。 代わりに @model Nullable<Int32> を使用してください。 また、構文 @model string[] もサポートされません。代わりに、@model IList<string> を使用します。

ASP.NET MVC 2 プロジェクトを ASP.NET MVC 3 にアップグレードする場合は、Web.config ファイルの appSettings セクションに必ず次の行を追加してください。

<appSettings>
  <add key="enableSimpleMembership" value="false" />
</appSettings>

フォーム認証で、認証されていないユーザーが常に ~/Account/Login にリダイレクトされ、Web.config で使用されているフォーム認証設定が無視される既知の問題があります。これを回避するには、次のアプリ設定を追加します。

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

免責情報

© 2011 Microsoft Corporation. All rights reserved. このドキュメントは、"現状のまま" 提供されます。URL およびその他のインターネット Web サイトの参照を含む、このドキュメントの情報および見解は、予告なしに変更することがあります。 このドキュメントの使用上のリスクは、すべてユーザーが負うものとします。

このドキュメントは、Microsoft 製品の知的財産権に関する法的な権利をお客様に許諾するものではありません。 内部での参照を目的とする場合、このドキュメントをコピーして使用できます。