No ASP.NET 4, isso era tão fácil quanto routes.LowercaseUrls = true;
noRegisterRoutes
manipulador do aplicativo.
Não consigo encontrar um equivalente no ASP.NET Core para conseguir isso. Eu acho que seria aqui:
app.UseMvc(configureRoutes =>
{
configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});
Mas nada configureRoutes
parece permitir isso ... a menos que haja um método de extensão em algum lugar que eu não consigo encontrar nos documentos, talvez?
c#
asp.net-core
asp.net-core-mvc
mariocatch
fonte
fonte
AddMvc()
seuStartup.ConfigureServices()
método.AddRouting()
que também é chamado deAddMvc()
usa asTry
variantes dos métodos para adicionar dependências à coleção de serviços. Portanto, quando ele vir que as dependências de roteamento já foram adicionadas, ele ignorará essas partes daAddMvc()
lógica de configuração.AddMvc
(ouAddControllersWithViews
se você não precisar do RazorPages) mais. Portanto, a ordem só importa realmente se você estiver usando AspNetCore 2. (Não me lembro se essa era uma opção em 1.x). No entanto, eles fizeram dividir o comportamento minúsculas em duas configurações, então se você quiser endereços de caso totalmente inferiores, você precisa configurar tantoLowercaseUrls
eLowercaseQueryStrings
paratrue
.Atualização na versão ASP.NET Core> = 2.2
No ASP.NET Core 2.2 , junto com letras minúsculas, você também pode fazer sua rota tracejada usando
ConstraintMap
que fará sua rota/Employee/EmployeeDetails/1
para em/employee/employee-details/1
vez de/employee/employeedetails/1
.Para fazer isso, primeiro crie a
SlugifyParameterTransformer
classe deve ser da seguinte forma: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:
No
ConfigureServices
método daStartup
aula:services.AddRouting(option => { option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer); });
E a configuração da rota deve ser a seguinte:
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:
No
ConfigureServices
método daStartup
aula: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:
No
ConfigureServices
método daStartup
aula:services.AddRouting(option => { option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer); });
E a configuração da rota deve ser a seguinte:
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 API da Web:
No
ConfigureServices
método daStartup
aula:services.AddControllers(options => { options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer())); });
Para ASP.NET Core> = 3.0 Páginas Razor:
No
ConfigureServices
método daStartup
aula:services.AddRazorPages(options => { options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer())); })
Isto fará o
/Employee/EmployeeDetails/1
caminho para/employee/employee-details/1
fonte
employee-details
. Você poderia me mostrar sua configuração, por favor?Como outras respostas indicam, acrescentando:
services.Configure<RouteOptions>(options => options.LowercaseUrls = true);
antes
funciona muito bem, mas também quero acrescentar que, se você usar o Identity, também precisará 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(); });
E, obviamente, substitua ambos
IdentityUser
eIdentityRole
por suas próprias classes, se necessário.Acabei de testar isso com o .NET Core SDK 1.0.4 e o runtime 1.0.5.
fonte
Encontrei a solução.
No assembly:
Microsoft.AspNet.Routing
e noMicrosoft.Extensions.DependencyInjection
namespace, você pode fazer isso em seuConfigureServices(IServiceCollection services)
método:services.ConfigureRouting(setupAction => { setupAction.LowercaseUrls = true; });
fonte
Para identidade, a resposta de @Jorge Yanes Diez não funciona em
ASP.NET Core 2.2
( acho que 2.x ), então, se você usar Identity e ASP.NET Core 2.2 (2.x), aqui está a solução:services.ConfigureApplicationCookie(options => { options.LoginPath = "/account/login"; options.ReturnUrlParameter = "returnurl"; ... });
Ref: Configurar Identidade ASP.NET Core
fonte
Tive isso em RegisterRoutes :: RouteConfig:
routes.LowercaseUrls = true;
fonte