ASP.NET MVC 5.2 の新機能
作成者: Microsoft
このトピックでは、ASP.NET MVC 5.2、Microsoft.AspNet.MVC 5.2.2 および ASP.NET MVC 5.2.3 Beta の最新情報について説明します
ソフトウェア要件
- Visual Studio 2012: ASP.NET および Web Tools 2013.1 for Visual Studio 2012 をダウンロードします。
- Visual Studio 2013: Visual Studio 2013 Update 以上をダウンロードします。 この更新は、ASP.NET MVC 5.2 Razor ビューを編集するために必要です。
ダウンロード
ランタイム機能は、NuGet ギャラリーで NuGet パッケージとしてリリースされます。 ランタイム パッケージはすべてセマンティック バージョンの仕様に従います。 ASP.NET MVC 5.2 パッケージの最新バージョン: "5.2.0"。 これらのパッケージは、NuGet を使用してインストールまたは更新できます。 このリリースには、NuGet 上の対応するローカライズされたパッケージも含まれています。
リリース済みの NuGet パッケージは、NuGet パッケージ マネージャー コンソールを使用してインストールまたは更新できます。
インストールパッケージ Microsoft.AspNet.Mvc - バージョン 5.2.0
ドキュメント
ASP.NET MVC 5.2 に関するチュートリアルとその他の情報は、ASP.NET の Web サイト (https://www.asp.net/mvc) から入手できます。
ASP.NET MVC 5.2 の新機能
属性ルーティングの機能強化
属性ルーティングで IDirectRouteProvider と呼ばれる拡張性ポイントが提供されるようになりました。これにより、属性ルートの検出と構成方法を完全に制御できます。 IDirectRouteProvider は、アクションとコントローラーの一覧と関連するルート情報を提供し、それらのアクションに必要なルーティング構成を正確に指定する役割を担います。 MapAttributes/MapHttpAttributeRoutes を呼び出すときに、IDirectRouteProvider の実装を指定できます。
IDirectRouteProvider をカスタマイズするには、既定の実装である DefaultDirectRouteProvider を拡張するのが最も簡単です。 このクラスは、属性の検出、ルート エントリの作成、ルート プレフィックスとエリア プレフィックスの検出のロジックを変更するための、オーバーライド可能な仮想メソッドを個別に提供します。
IDirectRouteProvider の新しい属性ルーティング拡張性によって、ユーザーは以下の操作を行うことができます。
属性ルートの継承をサポートする。 たとえば、次のシナリオでは、Blog コントローラーと Store コントローラーは、BaseController によって定義されている属性ルート規則を使用しています。
[InheritedRoute("attributerouting/{controller}/{action=Index}/{id?}")] public abstract class BaseController : Controller { } public class BlogController : BaseController { public string Index() { return "Hello from blog!"; } } public class StoreController : BaseController { public string Index() { return "Hello from store!"; } } [AttributeUsage(AttributeTargets.Class, Inherited=true, AllowMultiple=true)] public class InheritedRouteAttribute : Attribute, IDirectRouteFactory { public InheritedRouteAttribute(string template) { Template=template; } public string Name { get; set; } public int Order { get; set; } public string Template { get; private set; } public new RouteEntry CreateRoute(DirectRouteFactoryContext context) { // context.Actions will always contain at least one action - and all of the // actions will always belong to the same controller. var controllerDescriptor=context.Actions.First().ControllerDescriptor; var template=Template.Replace("{controller}", controllerDescriptor.ControllerName); IDirectRouteBuilder builder=context.CreateBuilder(template); builder.Name=Name; builder.Order=Order; return builder.Build(); } } // Custom direct route provider which looks for route attributes of type // InheritedRouteAttribute and also supports attribute route inheritance. public class InheritedDirectRouteProvider : DefaultDirectRouteProvider { protected override IReadOnlyList<IDirectRouteFactory> GetControllerRouteFactories(ControllerDescriptor controllerDescriptor) { return controllerDescriptor .GetCustomAttributes(typeof(InheritedRouteAttribute), inherit: true) .Cast<IDirectRouteFactory>() .ToArray(); } }
属性ルートのルート名を自動的に生成する。
protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(ActionDescriptor actionDescriptor) { // Get all the route attributes decorated directly on the actions IReadOnlyList<IDirectRouteFactory> actionRouteFactories=base.GetActionRouteFactories(actionDescriptor); // Check if the route attribute on each action already has a route name and if no, // generate a route name automatically // based on the convention: <ControllerName>_<ActionName> (ex: Customers_GetById) foreach (IDirectRouteFactory routeFactory in actionRouteFactories) { RouteAttribute routeAttr=routeFactory as RouteAttribute; if (string.IsNullOrEmpty(routeAttr.Name)) { routeAttr.Name=actionDescriptor.ControllerDescriptor.ControllerName + "_" + actionDescriptor.ActionName; } } return actionRouteFactories; } protected override IReadOnlyList<IDirectRouteFactory> GetControllerRouteFactories(ControllerDescriptor controllerDescriptor) { // Get all the route attributes decorated directly on the controllers IReadOnlyList<IDirectRouteFactory> controllerRouteFactories=base.GetControllerRouteFactories(controllerDescriptor); // Check if the route attribute on each controller already has a route name and if no, // generate a route name automatically // based on the convention: <ControllerName>Route (ex: CustomersRoute) foreach (IDirectRouteFactory routeFactory in controllerRouteFactories) { RouteAttribute routeAttr=routeFactory as RouteAttribute; if (string.IsNullOrEmpty(routeAttr.Name)) { routeAttr.Name=controllerDescriptor.ControllerName + "Route"; } } return controllerRouteFactories; }
ルートがルート テーブルに追加される前に、ルート プレフィックスを一元的な場所で変更する。
属性ルーティングの検索範囲にしたいコントローラーを除外する。 3 と 4 に関しては間もなくブログを投稿する予定です。
変更された API サーフェスのための Facebook による修正プログラム
Facebook によって行われたいくつかの API 変更が原因で、MVC Facebook パッケージが破損しました。 Microsoft は、これらの問題を解決するために新しい Facebook パッケージ (Microsoft.AspNet.Facebook 1.0.0) もリリースしています。
既知の問題と重大な変更
5.2.0 パッケージを含むプロジェクトへの MVC/Web API のスキャフォールディングによって、プロジェクト内にまだ存在しないパッケージに関しては 5.1.2 パッケージがインストールされる
ASP.NET MVC 5.2.0 用の NuGet パッケージを更新しても、ASP.NET スキャフォールディングや ASP.NET Web アプリケーション プロジェクト テンプレートなどの Visual Studio ツールは更新されません。 これらのツールでは、ASP.NET ランタイム パッケージの旧バージョン (Update 2 の 5.1.2 など) を使用します。 その結果、ASP.NET スキャフォールディングでは、必要なパッケージがプロジェクトでまだ使用できない場合、旧バージョン (Update 2 の 5.1.2 など) がインストールされます。 ただし、Visual Studio 2013 RTM または Update 1 の ASP.NET スキャフォールディングでは、プロジェクト内の最新のパッケージは上書きされません。 プロジェクトのパッケージを Web API 2.2 または ASP.NET MVC 5.2 に更新した後に ASP.NET スキャフォールディングを使用する場合は、Web API と ASP.NET MVC のバージョンに一貫性があることを確認してください。
jQuery 1.4.1 と互換性のある Microsoft.jQuery.Unobtrusive.Validation のバージョンを見つけることができないため、Microsoft.jQuery.Unobtrusive.Validation NuGet パッケージのインストールが失敗する
Microsoft.jQuery.Unobtrusive.Validation には、jQuery >=1.8 と jQuery.Validation >=1.8 が必要です。 しかし、jQuery.Validation (1.8) には jQuery (≥ 1.3.2 && ≤ 1.6) が必要です。 このため、NuGet が JQuery 1.8 と jQuery.Validation 1.8 を同時にインストールすると、失敗します。 この問題が発生したら、jQuery.Validation のバージョンを >= 1.8.0.1 に更新するだけで jQuery の上限が最初に修正されるので、Microsoft.jQuery.Unobtrusive.Validation をインストールできるようになるはずです。
jQuery.Validation NuGet パッケージ バージョン 1.13.0 が一部の国際メール アドレスを認識しない
jQuery.Validation NuGet パッケージ バージョン 1.11.1 は、以下の有効なメール アドレスを認識することがわかっている最新のバージョンです。 それ以降のバージョンはこれらを認識できない可能性があります。 次に例を示します。
e メール アドレス国際化 (EAI) 標準 (例: 用户@domain.com)
EAI + 国際化リソース識別子 (IRI) (例: 用户@домен.рф)
この問題は https://github.com/jzaefferer/jquery-validation/issues/1222 で報告されています
Visual Studio 2013 での Razor ビューの構文の強調表示
Visual Studio 2013 を更新せずに ASP.NET MVC 5.2 に更新した場合、Razor ビューの編集中の構文の強調表示に関する Visual Studio エディター サポートを受けられません。 このサポートを受けるためには、Visual Studio 2013 を更新する必要があります。