En ASP.NET 4 esto era tan fácil como routes.LowercaseUrls = true;
en el RegisterRoutes
controlador de la aplicación.
No puedo encontrar un equivalente en ASP.NET Core para lograr esto. Creo que estaría aquí:
app.UseMvc(configureRoutes =>
{
configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});
Pero nada en configureRoutes
apariencia lo permite ... a menos que haya un método de extensión en algún lugar que no pueda encontrar en los documentos, ¿quizás?
c#
asp.net-core
asp.net-core-mvc
mariocatch
fuente
fuente
AddMvc()
a suStartup.ConfigureServices()
método.AddRouting()
que también es llamado porAddMvc()
usa lasTry
variantes de los métodos para agregar dependencias a su colección de servicios. Entonces, cuando vea que las dependencias de enrutamiento ya se agregaron, omitirá esas partes deAddMvc()
la lógica de configuración.Actualización en ASP.NET Core Version> = 2.2
Desde ASP.NET Core 2.2 , junto con minúsculas , también puede hacer que su ruta sea discontinua usando lo
ConstraintMap
que hará que su ruta/Employee/EmployeeDetails/1
a en/employee/employee-details/1
lugar de/employee/employeedetails/1
.Para hacerlo, primero crear la
SlugifyParameterTransformer
clase debe ser la siguiente: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(); } }
Para ASP.NET Core 2.2 MVC:
En el
ConfigureServices
método de laStartup
clase:services.AddRouting(option => { option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer); });
Y la configuración de la ruta debe ser la siguiente:
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller:slugify}/{action:slugify}/{id?}", defaults: new { controller = "Home", action = "Index" }); });
Para ASP.NET Core 2.2 Web API:
En el
ConfigureServices
método de laStartup
clase:public void ConfigureServices(IServiceCollection services) { services.AddMvc(options => { options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer())); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
Para ASP.NET Core> = 3.0 MVC:
En el
ConfigureServices
método de laStartup
clase:services.AddRouting(option => { option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer); });
Y la configuración de la ruta debe ser la siguiente:
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" }); });
Para ASP.NET Core> = 3.0 Web API:
En el
ConfigureServices
método de laStartup
clase:services.AddControllers(options => { options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer())); });
Para ASP.NET Core> = 3.0 Razor Pages:
En el
ConfigureServices
método de laStartup
clase:services.AddRazorPages(options => { options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer())); })
Esto hará
/Employee/EmployeeDetails/1
ruta a/employee/employee-details/1
fuente
employee-details
. ¿Me podría mostrar su configuración por favor?Como indican otras respuestas, agregando:
services.Configure<RouteOptions>(options => options.LowercaseUrls = true);
antes de
funciona muy bien, pero también quiero agregar que si usa Identity, también necesitará:
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(); });
Y, obviamente, reemplace ambos
IdentityUser
, yIdentityRole
con sus propias clases si es necesario.Acabo de probar esto con .NET Core SDK 1.0.4 y el tiempo de ejecución 1.0.5.
fuente
Encontré la solución.
En el ensamblado:
Microsoft.AspNet.Routing
y elMicrosoft.Extensions.DependencyInjection
espacio de nombres, puede hacer esto en suConfigureServices(IServiceCollection services)
método:services.ConfigureRouting(setupAction => { setupAction.LowercaseUrls = true; });
fuente
Para la identidad, la respuesta de @Jorge Yanes Diez no funciona en
ASP.NET Core 2.2
( creo que 2.x ), por lo que si usa Identity y ASP.NET Core 2.2 (2.x) aquí está la solución:services.ConfigureApplicationCookie(options => { options.LoginPath = "/account/login"; options.ReturnUrlParameter = "returnurl"; ... });
Ref: Configurar la identidad de ASP.NET Core
fuente
Tenía esto en RegisterRoutes :: RouteConfig:
route.LowercaseUrls = true;
fuente