Bagikan melalui


Yang Baru di ASP.NET MVC 5.2

oleh Microsoft

Topik ini menjelaskan apa yang baru untuk ASP.NET MVC 5.2, Microsoft.AspNet.MVC 5.2.2 dan ASP.NET MVC 5.2.3 Beta

Persyaratan Perangkat Lunak

Unduh

Fitur runtime dirilis sebagai paket NuGet di galeri NuGet. Semua paket runtime mengikuti spesifikasi Penerapan Versi Semantik . Paket MVC 5.2 ASP.NET terbaru memiliki versi berikut: "5.2.0". Anda dapat menginstal atau memperbarui paket ini melalui NuGet. Rilis ini juga mencakup paket lokal yang sesuai di NuGet.

Anda dapat menginstal atau memperbarui ke paket NuGet yang dirilis dengan menggunakan NuGet Package Manager Console:

Install-Package Microsoft.AspNet.Mvc -Versi 5.2.0

Dokumentasi

Tutorial dan informasi lain tentang ASP.NET MVC 5.2 tersedia dari situs web ASP.NET (https://www.asp.net/mvc).

Fitur Baru di ASP.NET MVC 5.2

Peningkatan perutean atribut

Perutean Atribut sekarang menyediakan titik ekstensibilitas yang disebut IDirectRouteProvider, yang memungkinkan kontrol penuh atas bagaimana rute atribut ditemukan dan dikonfigurasi. IDirectRouteProvider bertanggung jawab untuk menyediakan daftar tindakan dan pengontrol bersama dengan informasi rute terkait untuk menentukan dengan tepat konfigurasi perutean apa yang diinginkan untuk tindakan tersebut. Implementasi IDirectRouteProvider dapat ditentukan saat memanggil MapAttributes/MapHttpAttributeRoutes.

Menyesuaikan IDirectRouteProvider akan paling mudah dengan memperluas implementasi default kami, DefaultDirectRouteProvider. Kelas ini menyediakan metode virtual yang dapat diganti terpisah untuk mengubah logika untuk menemukan atribut, membuat entri rute, dan menemukan awalan rute dan awalan area.

Dengan ekstensibilitas perutean atribut baru IDirectRouteProvider, pengguna dapat melakukan hal berikut:

  1. Mendukung Pewarisan rute atribut. Misalnya, dalam skenario berikut pengontrol Blog dan Store menggunakan konvensi rute atribut yang ditentukan oleh 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. Secara otomatis menghasilkan nama rute untuk rute atribut.

    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. Ubah awalan rute di satu tempat terpusat sebelum rute ditambahkan ke tabel rute.

  4. Filter pengontrol tempat Anda ingin perutean atribut dicari. Kami berharap untuk blog di 3 dan 4 segera.

perbaikan Facebook untuk permukaan API yang diubah

Paket Facebook MVC rusak karena beberapa perubahan API yang dilakukan oleh Facebook. Kami juga merilis paket Facebook baru (Microsoft.AspNet.Facebook 1.0.0) untuk memperbaiki masalah ini.

Masalah yang Diketahui dan Perubahan yang Melanggar

Perancah MVC/Web API ke dalam proyek dengan paket 5.2.0 menghasilkan paket 5.1.2 untuk yang belum ada dalam proyek

Memperbarui paket NuGet untuk ASP.NET MVC 5.2.0 tidak memperbarui alat Visual Studio seperti perancah ASP.NET atau templat proyek Aplikasi Web ASP.NET. Mereka menggunakan versi sebelumnya dari paket runtime ASP.NET (misalnya 5.1.2 di Pembaruan 2). Akibatnya, perancah ASP.NET akan menginstal versi sebelumnya (misalnya 5.1.2 di Pembaruan 2) dari paket yang diperlukan, jika belum tersedia di proyek Anda. Namun, perancah ASP.NET di Visual Studio 2013 RTM atau Pembaruan 1 tidak menimpa paket terbaru dalam proyek Anda. Jika Anda menggunakan perancah ASP.NET setelah memperbarui paket proyek Anda ke Web API 2.2 atau ASP.NET MVC 5.2, pastikan versi Web API dan ASP.NET MVC konsisten.

Penginstalan paket NuGet Microsoft.jQuery.Unobtrusive.Validation gagal karena tidak dapat menemukan versi Microsoft.jQuery.Unobtrusive.Validation yang kompatibel dengan jQuery 1.4.1

Microsoft.jQuery.Unobtrusive.Validation memerlukan jQuery >=1.8 dan jQuery.Validation >=1.8. Tapi, jQuery.Validation (1.8) membutuhkan jQuery (≥ 1.3.2 && ≤ 1.6). Karena itu, ketika NuGet menginstal JQuery 1.8 dan jQuery.Validation 1.8 pada saat yang sama, itu gagal. Ketika Anda melihat masalah ini, Anda cukup memperbarui versi jQuery.Validation ke >= 1.8.0.1 yang memiliki batas jQuery tetap terlebih dahulu, Anda harus dapat menginstal Microsoft.jQuery.Unobtrusive.Validation.

Jquery itu. Paket nuget validasi versi 1.13.0 tidak mengenali beberapa alamat email internasional

paket nuget jQuery.Validation versi 1.11.1 adalah versi terakhir yang diketahui yang mengenali alamat email yang valid berikut. Versi yang lebih baru mungkin tidak dapat mengenalinya. Contohnya:

Standar E-Mail Address Internationalization (EAI) (misalnya, 用户@domain.com)
Pengidentifikasi Sumber Daya EAI + Internasional (IRIs) (misalnya, 用户@домен.рф)

Masalah ini dilaporkan pada https://github.com/jzaefferer/jquery-validation/issues/1222

Penyorotan Sintaks untuk Tampilan Razor di Visual Studio 2013

Jika Anda memperbarui ke ASP.NET MVC 5.2 tanpa memperbarui Visual Studio 2013, Anda tidak akan mendapatkan dukungan editor Visual Studio untuk penyorotan sintaks saat mengedit tampilan Razor. Anda harus memperbarui Visual Studio 2013 untuk mendapatkan dukungan ini.