Wie erzwingen Sie das Routing in Kleinbuchstaben in ASP.NET Core?

90

In ASP.NET 4 war dies so einfach wie routes.LowercaseUrls = true;im RegisterRoutesHandler für die App.

Ich kann in ASP.NET Core kein Äquivalent finden, um dies zu erreichen. Ich würde denken, es wäre hier:

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

Aber nichts in configureRoutessieht aus, um es zuzulassen ... es sei denn, es gibt irgendwo eine Erweiterungsmethode, die ich vielleicht nicht in den Dokumenten finden kann?

Mariocatch
quelle

Antworten:

192

Für ASP.NET Core:

Fügen Sie der ConfigureServicesMethode der StartupKlasse die folgende Zeile hinzu .

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

Vielen Dank an Skorunka für die Antwort als Kommentar. Ich dachte, es lohnt sich, für eine tatsächliche Antwort zu werben.

Handwerksspiele
quelle
35
Es ist erwähnenswert, dass Sie dies eingeben sollten, bevor Sie AddMvc()Ihre Startup.ConfigureServices()Methode tatsächlich aufrufen . AddRouting()Dies wird auch von AddMvc()verwendet, indem die TryVarianten der Methoden zum Hinzufügen von Abhängigkeiten zu Ihrer Service-Sammlung verwendet werden. Wenn also festgestellt wird, dass die Routing-Abhängigkeiten bereits hinzugefügt wurden, werden diese Teile der AddMvc()Setup-Logik übersprungen.
Nick Albrecht
Umschalten auf richtige Antwort, da meine während des Übergangs von Asp 4 zu Core war.
Mariocatch
31

Update in ASP.NET Core Version> = 2.2

Von ASP.NET - Core 2.2 , zusammen mit Klein Sie auch Ihre machen Route gestrichelte verwenden , ConstraintMapdie Ihre Route machen /Employee/EmployeeDetails/1zu /employee/employee-details/1statt /employee/employeedetails/1.

Erstellen Sie dazu zunächst die SlugifyParameterTransformerKlasse wie folgt:

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

Für ASP.NET Core 2.2 MVC:

In der ConfigureServicesMethode der StartupKlasse:

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

Die Routenkonfiguration sollte wie folgt aussehen:

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

Für die ASP.NET Core 2.2-Web-API:

In der ConfigureServicesMethode der StartupKlasse:

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

Für ASP.NET Core> = 3.0 MVC:

In der ConfigureServicesMethode der StartupKlasse:

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

Die Routenkonfiguration sollte wie folgt aussehen:

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

Für ASP.NET Core> = 3.0 Web API:

In der ConfigureServicesMethode der StartupKlasse:

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

Für ASP.NET Core> = 3.0 Rasiermesserseiten:

In der ConfigureServicesMethode der StartupKlasse:

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

Dies wird den /Employee/EmployeeDetails/1Weg zu machen/employee/employee-details/1

TanvirArjel
quelle
Ich habe diesen Code und auch den offiziellen Microsoft-Code ausprobiert, aber der Parametertransformator "slugify" hat keine Auswirkung. Es wird vom Routing-System einfach ignoriert (URLs werden also nicht durch gestrichelte ersetzt). Um mich selbst zu überprüfen, habe ich den Logger in die TransformOutbound () -Methode eingefügt, aber keine Aufrufe von dort.
user3172616
In Ordnung! Lass mich bitte einmal nachsehen!
TanvirArjel
@ user3172616 Ich habe es gerade überprüft! es funktioniert wie erwartet! wie Route generieren als employee-details. Würden Sie mir bitte Ihre Konfiguration zeigen?
TanvirArjel
@ user3172616 Verwenden Sie das Attribut-Routing auf der von Ihnen getesteten Route?
TanvirArjel
Ich verwende den Standard-Routing-Ansatz (kein Attribut-Routing) für die brandneue Core 2.2-Lösung in Visual Studio. Es gibt zwei Screenshots (c # -Code und .cshtml-Code). Ich habe versucht, Links auf unterschiedliche Weise ohne Wirkung zu generieren. imgur.com/a/L8dCF6c
user3172616
20

Wie andere Antworten zeigen, fügen Sie hinzu:

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

Vor

services.AddMvc(...)

funktioniert gut, aber ich möchte auch hinzufügen, dass Sie, wenn Sie Identität verwenden, auch Folgendes benötigen:

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

Und natürlich ersetzen Sie beide IdentityUserund IdentityRolebei Bedarf durch Ihre eigenen Klassen.

Ich habe dies gerade mit .NET Core SDK 1.0.4 und der Laufzeit 1.0.5 getestet.

Jorge Yanes Diez
quelle
Configure <RouteOptions> () ist die beste Antwort imho: winzig und direkt auf den Punkt (getestet auf mvc core 3.1)
T-moty
12

Die Lösung gefunden.

In der Assembly: Microsoft.AspNet.Routingund im Microsoft.Extensions.DependencyInjectionNamespace können Sie dies in Ihrer ConfigureServices(IServiceCollection services)Methode tun :

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});
Mariocatch
quelle
15
Für ASP NET MVC CORE: services.AddRouting (options => {options.LowercaseUrls = true;});
Skorunka František
Microsoft.Extensions.DependencyInjection in Microsoft.AspNetCore.Routing.dll
Skorunka František
3
Dies war vor RTM wahr, jetzt sollten Sie .AddRouting anstelle von .ConfigureRouting
Yves Schelpe
0

Ich hatte dies auf RegisterRoutes :: RouteConfig:

route.LowercaseUrls = true;

Paburgos
quelle