ASP.NET Core'da küçük harfli yönlendirmeyi nasıl zorlarsınız?


94

ASP.NET 4'te bu kadar kolay oldu routes.LowercaseUrls = true;de RegisterRoutesuygulama için işleyici.

Bunu başarmak için ASP.NET Core'da bir eşdeğer bulamıyorum. Burada olacağını düşünüyorum:

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

Ama hiçbir şey configureRoutesbuna izin verecek gibi görünmüyor ... bir yerde belki de belgelerde bulamadığım bir uzatma yöntemi yoksa?

Yanıtlar:


202

ASP.NET Core için:

Aşağıdaki satırı sınıfın ConfigureServicesyöntemine ekleyin Startup.

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

Cevap için Skorunka'ya yorum olarak teşekkür ederiz. Gerçek bir cevaba terfi etmeye değer olduğunu düşündüm.


35
Aslında çağrı ÖNCE bunu koymalıyız belirterek It değerinde AddMvc()senin içinde Startup.ConfigureServices()yöntemle. AddRouting()tarafından çağrılan , hizmet koleksiyonunuza bağımlılıklar eklemek için yöntemlerin çeşitlerini AddMvc()kullanır Try. Dolayısıyla, yönlendirme bağımlılıklarının zaten eklendiğini gördüğünde, AddMvc()kurulum mantığının bu kısımlarını atlayacaktır .
Nick Albrecht

Benimki asp 4'ün çekirdeğe geçişi sırasında olduğu için bunu doğru cevaba çevirmek.
mariocatch

@NickAlbrecht, önce veya sonra çağrılması bir fark yaratmıyor gibi görünüyor (en azından ASP.NET Core 5.0 itibariyle). AddRouting () yine de iki kez çağrılacaktır, bu nedenle hangi sırada olduğu önemli değildir.
Thomas Levesque

Bunun .NET Core 3.x etrafında yapıldığına inanıyorum. Yönlendirme, MVC ile birlikte değil bağımsız bir özellik olacak şekilde değiştirdiler. Artık yönlendirmenin AddMvc(veya AddControllersWithViewsRazorPages'e ihtiyacınız yoksa) çağrıldığına inanmıyorum. Bu nedenle, sipariş yalnızca AspNetCore 2 kullanıyorsanız gerçekten önemlidir (Bunun 1.x'te bir seçenek olup olmadığını hatırlamayın). Ancak onlar yaptılar tamamen küçük harf adresleri istiyoruz eğer öyleyse, iki ayar içine küçük davranışını bölmek, her iki ayarlamanız gerekir LowercaseUrlsve LowercaseQueryStringsiçin true.
Nick Albrecht

37

ASP.NET Core Sürümünde Güncelleme> = 2.2

Gönderen ASP.NET Çekirdek 2.2 ile birlikte küçük harflerle ayrıca yapabilirsiniz rota kesik kullanarak ConstraintMaprotanızı yapacak /Employee/EmployeeDetails/1kadar /employee/employee-details/1yerine /employee/employeedetails/1.

Bunu yapmak için önce SlugifyParameterTransformersınıfı aşağıdaki gibi oluşturun:

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();
    }
}

ASP.NET Core 2.2 MVC için:

Gelen ConfigureServicesyöntemine Startupsınıfı:

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

Ve Rota konfigürasyonu aşağıdaki gibi olmalıdır:

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

ASP.NET Core 2.2 Web API için:

Gelen ConfigureServicesyöntemine Startupsınıfı:

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

ASP.NET Core> = 3.0 MVC için:

Gelen ConfigureServicesyöntemine Startupsınıfı:

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

Ve Rota konfigürasyonu aşağıdaki gibi olmalıdır:

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" });
});

ASP.NET Core> = 3.0 Web API için:

Gelen ConfigureServicesyöntemine Startupsınıfı:

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

ASP.NET Core> = 3.0 Razor Sayfaları için:

Gelen ConfigureServicesyöntemine Startupsınıfı:

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

Bu /Employee/EmployeeDetails/1rota yapacak/employee/employee-details/1


Bu kodu ve resmi Microsoft kodunu da denedim, ancak "slugify" parametre transformatörünün hiçbir etkisi olmadı. Yönlendirme sistemi tarafından göz ardı edilir (dolayısıyla URL'ler kesik çizgili olanlarla değiştirilmez). Kendimi kontrol etmek için logger'ı TransformOutbound () yöntemine koydum, ancak oradan çağrı yok.
user3172616

Tamam! Lütfen kontrol edeyim!
TanvirArjel

@ user3172616 Şu anda kontrol ettim! beklendiği gibi çalışıyor! Gibi rota oluşturmak gibi employee-details. Lütfen bana konfigürasyonunuzu gösterir misiniz?
TanvirArjel

@ user3172616 Test ettiğiniz rotada öznitelik yönlendirmesini kullanıyor musunuz?
TanvirArjel

Visual Studio'daki yepyeni çekirdek v2.2 çözümünde standart yönlendirme yaklaşımını (öznitelik yönlendirme değil) kullanıyorum. İki ekran görüntüsü vardır (c # kodu ve .cshtml kodu). Etkisiz farklı şekillerde bağlantılar oluşturmaya çalıştım. imgur.com/a/L8dCF6c
user3172616

21

Diğer yanıtların da belirttiği gibi, ekleyerek:

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

önce

services.AddMvc(...)

harika çalışıyor, ancak ayrıca Kimlik kullanırsanız şunlara da ihtiyacınız olacağını eklemek istiyorum:

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();
});

Ve tabii ki, her ikisini de değiştirin IdentityUserve IdentityRolegerekirse kendi sınıflarınızla değiştirin .

Bunu .NET Core SDK 1.0.4 ve 1.0.5 çalışma zamanı ile test ettim.


Yapılandırın <RouteOptions> () en iyi yanıttır imho: küçük ve doğrudan noktaya (mvc core 3.1 üzerinde test edilmiştir)
T-moty

12

Çözümü buldum.

Derlemede: Microsoft.AspNet.Routingve Microsoft.Extensions.DependencyInjectionad alanında, bunu ConfigureServices(IServiceCollection services)yönteminizde yapabilirsiniz:

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});

15
ASP NET MVC CORE için: services.AddRouting (seçenekler => {options.LowercaseUrls = true;});
Skorunka František

Microsoft.AspNetCore.Routing.dll'de Microsoft.Extensions.DependencyInjection
Skorunka František

3
Bu RTM'den önce doğruydu, şimdi .ConfigureRouting yerine .AddRouting'i kullanmalısınız
Yves Schelpe


-1

RegisterRoutes :: RouteConfig'de bunu yaşadım:

route.LowercaseUrls = true;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.