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 工具 2013.1 for Visual Studio 2012。
- Visual Studio 2013:下載 Visual Studio 2013 更新或更高版本。 編輯 ASP.NET MVC 5.2 Razor 檢視需要此更新。
下載
運行時間功能會以 NuGet 資源庫上的 NuGet 套件的形式發行。 所有運行時間套件都遵循 語意版本設定 規格。 最新的 ASP.NET MVC 5.2 套件具有下列版本:“5.2.0”。 您可以透過 NuGet 安裝或更新這些套件。 此版本也包含 NuGet 上的對應當地語系化套件。
您可以使用 NuGet 套件管理員主控台來安裝或更新已發行的 NuGet 套件:
Install-Package Microsoft.AspNet.Mvc -5.2.0 版
文件
ASP.NET 網站 https://www.asp.net/mvc () 提供 ASP.NET MVC 5.2 的教學課程和其他資訊。
ASP.NET MVC 5.2 中的新功能
屬性路由改善
屬性路由現在提供稱為 IDirectRouteProvider 的擴充點,可讓您完整控制如何探索和設定屬性路由。 IDirectRouteProvider 負責提供動作和控制器清單,以及相關聯的路由資訊,以確切指定這些動作所需的路由設定。 呼叫 MapAttributes/MapHttpAttributeRoutes 時,可以指定 IDirectRouteProvider 實作。
藉由擴充預設實作 DefaultDirectRouteProvider,自定義 IDirectRouteProvider 會最簡單。 這個類別提供個別可覆寫的虛擬方法,以變更探索屬性、建立路由專案,以及探索路由前置詞和區域前置詞的邏輯。
透過 IDirectRouteProvider 的新屬性路由擴充性,使用者可以執行下列動作:
支援屬性路由的繼承。 例如,在下列案例中,部落格和市集控制器使用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 修正
MVC Facebook 套件因為 Facebook 所做的 API 變更而中斷。 我們也發行新的 Facebook 套件, (Microsoft.AspNet.Facebook 1.0.0) 來修正這些問題。
已知問題和重大變更
將MVC/Web API Scaffolding至具有5.2.0套件的專案,會導致專案中不存在的專案產生5.1.2套件
更新 ASP.NET MVC 5.2.0 的 NuGet 套件不會更新 Visual Studio 工具,例如 ASP.NET Scaffolding 或 ASP.NET Web 應用程式專案範本。 他們會在 Update 2) 中使用舊版 ASP.NET 運行時間套件 (,例如 5.1.2。 因此,ASP.NET Scaffolding 會安裝舊版 (,例如 Update 2 中的 5.1.2) 必要套件,如果您的專案中尚未提供這些套件。 不過,Visual Studio 2013 RTM 或 Update 1 中的 ASP.NET Scaffolding 不會覆寫您專案中的最新套件。 如果您在將專案的套件更新至 Web API 2.2 或 ASP.NET MVC 5.2 之後使用 ASP.NET Scaffolding,請確定 Web API 和 ASP.NET MVC 的版本一致。
Microsoft.jQuery.Unobtrusive.Validation NuGet 套件安裝失敗,因為它找不到與 jQuery 1.4.1 兼容的 Microsoft.jQuery.Unobtrusive.Validation 版本
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。驗證 nuget 套件 1.13.0 版無法辨識某些國際電子郵件位址
jQuery.Validation nuget 套件 1.11.1 版是最後一個已知版本,可辨識下列有效的電子郵件位址。 任何較新的版本都可能無法辨識它們。 例如:
電子郵件地址國際化 (EAI) 標準 (,例如 用户@domain.com)
EAI + 國際化資源標識符 (IRIs) (例如, 使用者@домен.рф)
問題報告於 https://github.com/jzaefferer/jquery-validation/issues/1222
Visual Studio 2013 中Razor檢視的語法醒目提示
如果您更新為 ASP.NET MVC 5.2 而不更新 Visual Studio 2013,則編輯 Razor 檢視時,將不會取得 Visual Studio 編輯器對語法醒目提示的支援。 您必須更新 Visual Studio 2013 才能取得此支援。