Comment appliquer le routage en minuscules dans ASP.NET Core?

90

Dans ASP.NET 4, c'était aussi simple que routes.LowercaseUrls = true;dans le RegisterRoutesgestionnaire de l'application.

Je ne trouve pas d'équivalent dans ASP.NET Core pour y parvenir. Je pense que ce serait ici:

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

Mais rien dans les configureRoutesregards ne le permet ... à moins qu'il n'y ait une méthode d'extension quelque part que je ne trouve peut-être pas dans la documentation?

mariocatch
la source

Réponses:

192

Pour ASP.NET Core:

Ajoutez la ligne suivante à la ConfigureServicesméthode de la Startupclasse.

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

Merci à Skorunka pour la réponse en commentaire. J'ai pensé qu'il valait la peine de promouvoir une réponse réelle.

jeux d'artisanat
la source
35
Il est intéressant de noter que vous devez mettre ceci AVANT d'appeler réellement AddMvc()votre Startup.ConfigureServices()méthode. AddRouting()qui est également appelé par AddMvc()utilise les Tryvariantes des méthodes pour ajouter des dépendances à votre collection de services. Ainsi, lorsqu'il verra que les dépendances de routage ont déjà été ajoutées, il ignorera ces parties de AddMvc()la logique de configuration.
Nick Albrecht le
Passage à la bonne réponse car le mien était pendant la transition d'asp 4 vers core.
mariocatch
31

Mise à jour dans la version ASP.NET Core> = 2.2

À partir d' ASP.NET Core 2.2 , en plus des minuscules, vous pouvez également rendre votre itinéraire en pointillés en utilisant ConstraintMapce qui rendra votre itinéraire /Employee/EmployeeDetails/1au /employee/employee-details/1lieu de /employee/employeedetails/1.

Pour ce faire, créez d'abord la SlugifyParameterTransformerclasse comme suit:

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

Pour ASP.NET Core 2.2 MVC:

Dans la ConfigureServicesméthode de la Startupclasse:

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

Et la configuration de l'itinéraire doit être la suivante:

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

Pour l'API Web ASP.NET Core 2.2:

Dans la ConfigureServicesméthode de la Startupclasse:

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

Pour ASP.NET Core> = 3.0 MVC:

Dans la ConfigureServicesméthode de la Startupclasse:

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

Et la configuration de l'itinéraire doit être la suivante:

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

Pour l'API Web ASP.NET Core> = 3.0:

Dans la ConfigureServicesméthode de la Startupclasse:

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

Pour ASP.NET Core> = 3.0 Razor Pages:

Dans la ConfigureServicesméthode de la Startupclasse:

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

Ceci fera /Employee/EmployeeDetails/1route vers/employee/employee-details/1

TanvirArjel
la source
J'ai aussi essayé ce code et le code officiel de Microsoft, mais le transformateur de paramètre "slugify" n'a aucun effet. Il est simplement ignoré par le système de routage (donc les URL ne sont pas remplacées par des tirets). Pour me vérifier, j'ai mis le logger dans la méthode TransformOutbound (), mais aucun appel à partir de là.
user3172616
D'accord! Laissez-moi vérifier s'il vous plaît!
TanvirArjel
@ user3172616 Je l'ai vérifié maintenant! son fonctionnement comme prévu! comme générer une route comme employee-details. Voulez-vous me montrer votre configuration s'il vous plaît?
TanvirArjel
@ user3172616 utilisez-vous le routage d'attributs sur l'itinéraire que vous avez testé?
TanvirArjel
J'utilise l'approche de routage standard (pas le routage d'attributs) sur la toute nouvelle solution core v2.2 dans Visual Studio. Il y a deux captures d'écran (code c # et code .cshtml). J'ai essayé de générer des liens de différentes manières sans effet. imgur.com/a/L8dCF6c
user3172616
20

Comme d'autres réponses l'indiquent, ajouter:

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

avant

services.AddMvc(...)

fonctionne très bien, mais je tiens également à ajouter que si vous utilisez Identity, vous aurez également besoin de:

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

Et évidemment, remplacez les deux IdentityUser, et IdentityRolepar vos propres classes si nécessaire.

Je viens de tester cela avec .NET Core SDK 1.0.4 et le runtime 1.0.5.

Jorge Yanes Diez
la source
Configurez <RouteOptions> () est la meilleure réponse à mon humble avis: minuscule et droit au but (testé sur mvc core 3.1)
T-moty
12

J'ai trouvé la solution.

Dans l'assembly: Microsoft.AspNet.Routinget l' Microsoft.Extensions.DependencyInjectionespace de noms, vous pouvez le faire dans votre ConfigureServices(IServiceCollection services)méthode:

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});
mariocatch
la source
15
Pour ASP NET MVC CORE: services.AddRouting (options => {options.LowercaseUrls = true;});
Skorunka František
Microsoft.Extensions.DependencyInjection dans Microsoft.AspNetCore.Routing.dll
Skorunka František
3
C'était vrai avant RTM, maintenant vous devriez utiliser .AddRouting au lieu de .ConfigureRouting
Yves Schelpe
1

Pour l'identité, la réponse de @Jorge Yanes Diez ne fonctionne pas dans ASP.NET Core 2.2( je pense 2.x ), donc si vous utilisez Identity et ASP.NET Core 2.2 (2.x), voici la solution:

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

Réf: configurer l'identité ASP.NET Core

Mehdi Dehghani
la source
0

J'avais ceci sur RegisterRoutes :: RouteConfig:

routes.LowercaseUrls = true;

paburgos
la source