web-dev-qa-db-fra.com

Comment appliquer le routage minuscule dans ASP.NET Core?

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

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

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

Mais rien dans configureRoutes ne semble le permettre ... sauf s'il existe une méthode d'extension quelque part que je ne trouve pas dans la documentation peut-être?

38
mariocatch

Pour ASP.NET Core:

Ajoutez la ligne suivante à la méthode ConfigureServices de la classe Startup.

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

Merci à Skorunka pour la réponse en commentaire. Je pensais que cela valait la peine de promouvoir une réponse réelle.

95
craftworkgames

Comme d'autres réponses l'indiquent, en ajoutant:

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

avant

services.AddMvc(...)

fonctionne très bien, mais je veux aussi 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 IdentityUser et IdentityRole par vos propres classes si nécessaire.

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

11
Jorge Yanes Diez

Trouvé la solution.

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

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

Mise à jour dans ASP.NET Core 2.2

De ASP.NET Core 2.2 , en minuscule, vous pouvez également définir votre itinéraire en pointillés à l'aide de ConstraintMap, ce qui rendra votre itinéraire /Employee/EmployeeDetails/1 à /employee/employee-details/1 au lieu de /employee/employeedetails/1.

Pour ce faire, dans la méthode ConfigureServices de la classe Startup:

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

Et la classe SlugifyParameterTransformer devrait être la suivante:

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

Et la configuration de la route devrait être comme suit:

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

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

4
TanvirArjel

Pour l'identité, @Jorge Yanes Diez answer ne fonctionne pas dans ASP.NET Core 2.2 (je pense que 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é de base ASP.NET

0
Mehdi Dehghani