Jak wymusić routing małymi literami w ASP.NET Core?

90

W ASP.NET 4 było to tak proste, jak routes.LowercaseUrls = true;w RegisterRoutesmodule obsługi aplikacji.

Nie mogę znaleźć odpowiednika w ASP.NET Core, aby to osiągnąć. Myślę, że będzie tutaj:

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

Ale configureRouteswygląda na to, że nic na to nie pozwala ... chyba że gdzieś istnieje metoda rozszerzenia, której nie mogę znaleźć w dokumentacji?

mariocatch
źródło

Odpowiedzi:

192

W przypadku ASP.NET Core:

Dodaj następujący wiersz do ConfigureServicesmetody Startupklasy.

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

Dzięki Skorunce za odpowiedź jako komentarz. Pomyślałem, że warto promować się do rzeczywistej odpowiedzi.

gry rzemieślnicze
źródło
35
Warto zauważyć, że powinieneś umieścić to ZANIM faktycznie wywołasz AddMvc()swoją Startup.ConfigureServices()metodę. AddRouting()który jest również wywoływany przez, AddMvc()używa Trywariantów metod dodawania zależności do kolekcji usług. Więc kiedy zobaczy, że zależności routingu zostały już dodane, pominie te części AddMvc()logiki konfiguracji.
Nick Albrecht
Przełączam to na poprawną odpowiedź, ponieważ moja była podczas przejścia z asp 4 na rdzeń.
mariocatch
31

Aktualizacja w wersji ASP.NET Core> = 2,2

Z ASP.NET Core 2.2 wraz z małymi literami możesz również ustawić trasę przerywaną za pomocą, ConstraintMapco spowoduje, że Twoja trasa /Employee/EmployeeDetails/1do /employee/employee-details/1zamiast /employee/employeedetails/1.

Aby to zrobić, najpierw utwórz SlugifyParameterTransformerklasę w następujący sposób:

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

W przypadku ASP.NET Core 2.2 MVC:

W ConfigureServicesmetodzie Startupzajęć:

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

Konfiguracja trasy powinna wyglądać następująco:

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

W przypadku interfejsu API sieci Web ASP.NET Core 2.2:

W ConfigureServicesmetodzie Startupzajęć:

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

W przypadku ASP.NET Core> = 3,0 MVC:

W ConfigureServicesmetodzie Startupzajęć:

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

Konfiguracja trasy powinna wyglądać następująco:

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

Dla ASP.NET Core> = 3.0 Web API:

W ConfigureServicesmetodzie Startupzajęć:

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

Dla ASP.NET Core> = 3.0 Razor Pages:

W ConfigureServicesmetodzie Startupzajęć:

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

To da /Employee/EmployeeDetails/1drogę do/employee/employee-details/1

TanvirArjel
źródło
Wypróbowałem ten kod i oficjalny kod Microsoftu, ale transformator parametru „slugify” nie daje żadnego efektu. Jest po prostu ignorowany przez system routingu (więc adresy URL nie są zastępowane kreskami). Aby sprawdzić siebie, wstawiam logger do metody TransformOutbound (), ale nie ma wywołań stamtąd.
user3172616
W porządku! Pozwól mi sprawdzić proszę!
TanvirArjel
@ user3172616 Mam to teraz sprawdzić! działa zgodnie z oczekiwaniami! jak generowanie trasy jako employee-details. Czy możesz mi pokazać swoją konfigurację?
TanvirArjel
@ user3172616 czy używasz routingu atrybutów na trasie, którą przetestowałeś?
TanvirArjel
Używam standardowego podejścia do routingu (nie routingu atrybutów) w zupełnie nowym rozwiązaniu core v2.2 w Visual Studio. Istnieją dwa zrzuty ekranu (kod C # i kod .cshtml). Próbowałem generować linki na różne sposoby, bez efektu. imgur.com/a/L8dCF6c
user3172616
20

Jak wskazują inne odpowiedzi, dodając:

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

przed

services.AddMvc(...)

działa świetnie, ale chcę też dodać, że jeśli używasz Identity, będziesz potrzebować również:

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

I oczywiście zamień oba IdentityUser, aw IdentityRolerazie potrzeby własnymi klasami.

Właśnie przetestowałem to z .NET Core SDK 1.0.4 i środowiskiem uruchomieniowym 1.0.5.

Jorge Yanes Diez
źródło
Skonfiguruj <RouteOptions> () to najlepsza odpowiedź imho: malutka i prosto do celu (testowana na rdzeniu mvc 3.1)
T-moty
12

Znalazłem rozwiązanie.

W zestawie: Microsoft.AspNet.Routingi w Microsoft.Extensions.DependencyInjectionprzestrzeni nazw możesz to zrobić w swojej ConfigureServices(IServiceCollection services)metodzie:

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});
mariocatch
źródło
15
Dla ASP NET MVC CORE: services.AddRouting (options => {options.LowercaseUrls = true;});
Skorunka František
Microsoft.Extensions.DependencyInjection w Microsoft.AspNetCore.Routing.dll
Skorunka František
3
To było prawdą przed RTM, teraz powinieneś użyć .AddRouting zamiast .ConfigureRouting
Yves Schelpe
1

W przypadku tożsamości odpowiedź @Jorge Yanes Diez nie działa w ASP.NET Core 2.2( myślę, że 2.x ), więc jeśli używasz tożsamości i ASP.NET Core 2.2 (2.x), oto rozwiązanie:

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

Ref: Skonfiguruj tożsamość ASP.NET Core

Mehdi Dehghani
źródło
0

Miałem to na RegisterRoutes :: RouteConfig:

route.LowercaseUrls = true;

paburgos
źródło