Bagaimana Anda menerapkan perutean huruf kecil di ASP.NET Core?

90

Di ASP.NET 4 ini semudah routes.LowercaseUrls = true;di RegisterRouteshandler untuk aplikasi.

Saya tidak dapat menemukan padanan dalam ASP.NET Core untuk mencapai ini. Saya pikir itu akan ada di sini:

app.UseMvc(configureRoutes =>
{
    configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});

Tetapi tidak ada yang configureRoutesterlihat untuk mengizinkannya ... kecuali ada metode ekstensi di suatu tempat yang tidak dapat saya temukan di dokumen, mungkin?

mariocatch
sumber

Jawaban:

192

Untuk ASP.NET Core:

Tambahkan baris berikut ke ConfigureServicesmetode Startupkelas.

services.AddRouting(options => options.LowercaseUrls = true);

Terima kasih kepada Skorunka atas jawabannya sebagai komentar. Saya pikir itu layak untuk dipromosikan ke jawaban yang sebenarnya.

craftworkgames
sumber
35
Perlu dicatat bahwa Anda harus meletakkan ini SEBELUM Anda benar-benar memanggil metode AddMvc()Anda Startup.ConfigureServices(). AddRouting()yang juga dipanggil dengan AddMvc()menggunakan Tryvarian metode untuk menambahkan dependensi ke kumpulan layanan Anda. Jadi ketika melihat bahwa dependensi perutean telah ditambahkan, itu akan melewati bagian AddMvc()logika pengaturan itu.
Nick Albrecht
Mengalihkan ini ke jawaban yang benar karena milik saya selama transisi dari asp 4 ke inti.
mariocatch
32

Pembaruan dalam Versi Inti ASP.NET> = 2.2

Dari ASP.NET Inti 2.2 , bersama dengan huruf kecil Anda juga dapat membuat Anda dengan berlari menggunakan ConstraintMapyang akan membuat rute Anda /Employee/EmployeeDetails/1untuk /employee/employee-details/1bukan /employee/employeedetails/1.

Untuk melakukannya, buat SlugifyParameterTransformerkelas terlebih dahulu harus seperti berikut:

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string TransformOutbound(object value)
    {
        // Slugify value
        return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
    }
}

Untuk ASP.NET Core 2.2 MVC:

Dalam ConfigureServicesmetode Startupkelas:

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

Dan konfigurasi Rute harus sebagai berikut:

app.UseMvc(routes =>
{
     routes.MapRoute(
        name: "default",
        template: "{controller:slugify}/{action:slugify}/{id?}",
        defaults: new { controller = "Home", action = "Index" });
});

Untuk ASP.NET Core 2.2 Web API:

Dalam ConfigureServicesmetode Startupkelas:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => 
    {
        options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Untuk ASP.NET Core> = 3.0 MVC:

Dalam ConfigureServicesmetode Startupkelas:

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

Dan konfigurasi Rute harus sebagai berikut:

app.UseEndpoints(endpoints =>
{
      endpoints.MapAreaControllerRoute(
          name: "AdminAreaRoute",
          areaName: "Admin",
          pattern: "admin/{controller:slugify=Dashboard}/{action:slugify=Index}/{id:slugify?}");

      endpoints.MapControllerRoute(
          name: "default",
          pattern: "{controller:slugify}/{action:slugify}/{id:slugify?}",
          defaults: new { controller = "Home", action = "Index" });
});

Untuk ASP.NET Core> = 3.0 Web API:

Dalam ConfigureServicesmetode Startupkelas:

services.AddControllers(options => 
{
    options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
});

Untuk ASP.NET Core> = 3.0 Razor Pages:

Dalam ConfigureServicesmetode Startupkelas:

services.AddRazorPages(options => 
{
    options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer()));
})

Ini akan membuat /Employee/EmployeeDetails/1rute ke/employee/employee-details/1

TanvirArjel
sumber
Saya mencoba kode ini dan kode resmi Microsoft juga, tetapi transformator parameter "slugify" tidak berpengaruh. Itu hanya diabaikan oleh sistem perutean (jadi URL tidak diganti dengan yang putus-putus). Untuk memeriksa diri saya sendiri, saya memasukkan logger ke metode TransformOutbound (), tetapi tidak ada panggilan dari sana.
pengguna3172616
Baik! Izinkan saya memeriksanya!
TanvirArjel
@ user3172616 Saya telah memeriksanya sekarang! itu bekerja seperti yang diharapkan! seperti menghasilkan rute sebagai employee-details. Tolong tunjukkan konfigurasi Anda.
TanvirArjel
@ user3172616 apakah Anda menggunakan perutean atribut pada rute yang Anda uji?
TanvirArjel
Saya menggunakan pendekatan perutean standar (bukan perutean atribut) pada solusi inti v2.2 baru di Visual Studio. Ada dua tangkapan layar (kode c # dan kode .cshtml). Saya mencoba menghasilkan tautan dengan berbagai cara tanpa efek. imgur.com/a/L8dCF6c
pengguna3172616
20

Seperti jawaban lain menunjukkan, menambahkan:

services.Configure<RouteOptions>(options => options.LowercaseUrls = true);

sebelum

services.AddMvc(...)

berfungsi dengan baik, tetapi saya juga ingin menambahkan bahwa jika Anda menggunakan Identity, Anda juga akan memerlukan:

services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
    var appCookie = options.Cookies.ApplicationCookie;
    appCookie.LoginPath = appCookie.LoginPath.ToString().ToLowerInvariant();
    appCookie.LogoutPath = appCookie.LogoutPath.ToString().ToLowerInvariant();
    appCookie.ReturnUrlParameter = appCookie.ReturnUrlParameter.ToString().ToLowerInvariant();
});

Dan tentunya, ganti keduanya IdentityUser, dan IdentityRoledengan kelas Anda sendiri jika diperlukan.

Saya baru saja menguji ini dengan .NET Core SDK 1.0.4 dan runtime 1.0.5.

Jorge Yanes Diez
sumber
Konfigurasi <RouteOptions> () adalah jawaban terbaik imho: kecil dan langsung ke intinya (diuji pada mvc core 3.1)
T-moty
12

Menemukan solusinya.

Di assembly:, Microsoft.AspNet.Routingdan Microsoft.Extensions.DependencyInjectionnamespace, Anda dapat melakukan ini dalam ConfigureServices(IServiceCollection services)metode Anda :

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});
mariocatch
sumber
15
Untuk ASP NET MVC CORE: services.AddRouting (options => {options.LowercaseUrls = true;});
Skorunka František
Microsoft.Extensions.DependencyInjection di Microsoft.AspNetCore.Routing.dll
Skorunka František
3
Ini benar sebelum RTM, sekarang Anda harus menggunakan .AddRouting sebagai ganti .ConfigureRouting
Yves Schelpe
1

Untuk identitas, jawaban @Jorge Yanes Diez tidak berfungsi ASP.NET Core 2.2( menurut saya 2.x ), jadi jika Anda menggunakan Identity dan ASP.NET Core 2.2 (2.x) berikut solusinya:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = "/account/login";
    options.ReturnUrlParameter = "returnurl";
    ...
});

Ref: Konfigurasi Identitas Inti ASP.NET

Mehdi Dehghani
sumber
0

Saya punya ini di RegisterRoutes :: RouteConfig:

routes.LowercaseUrls = true;

paburgos
sumber