次の方法で共有


ASP.NET MVC 5.2 の新機能

作成者: Microsoft

このトピックでは、ASP.NET MVC 5.2、Microsoft.AspNet.MVC 5.2.2 および ASP.NET MVC 5.2.3 Beta の最新情報について説明します

ソフトウェア要件

ダウンロード

ランタイム機能は、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 の新しい属性ルーティング拡張性によって、ユーザーは以下の操作を行うことができます。

  1. 属性ルートの継承をサポートする。 たとえば、次のシナリオでは、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();
        }
    }
    
  2. 属性ルートのルート名を自動的に生成する。

    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. 属性ルーティングの検索範囲にしたいコントローラーを除外する。 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 を更新する必要があります。