W ASP.NET 4 było to tak proste, jak routes.LowercaseUrls = true;
w RegisterRoutes
module obsługi aplikacji.
Nie mogę znaleźć odpowiednika w ASP.NET Core, aby to osiągnąć. Myślę, że będzie tutaj:
app.UseMvc(configureRoutes =>
{
configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});
Ale configureRoutes
wygląda na to, że nic na to nie pozwala ... chyba że gdzieś istnieje metoda rozszerzenia, której nie mogę znaleźć w dokumentacji?
c#
asp.net-core
asp.net-core-mvc
mariocatch
źródło
źródło
AddMvc()
swojąStartup.ConfigureServices()
metodę.AddRouting()
który jest również wywoływany przez,AddMvc()
używaTry
wariantów metod dodawania zależności do kolekcji usług. Więc kiedy zobaczy, że zależności routingu zostały już dodane, pominie te częściAddMvc()
logiki konfiguracji.Aktualizacja w wersji ASP.NET Core> = 2,2
Z ASP.NET Core 2.2 wraz z małymi literami możesz również ustawić trasę przerywaną za pomocą,
ConstraintMap
co spowoduje, że Twoja trasa/Employee/EmployeeDetails/1
do/employee/employee-details/1
zamiast/employee/employeedetails/1
.Aby to zrobić, najpierw utwórz
SlugifyParameterTransformer
klasę w następujący sposób: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(); } }
W przypadku ASP.NET Core 2.2 MVC:
W
ConfigureServices
metodzieStartup
zajęć:services.AddRouting(option => { option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer); });
Konfiguracja trasy powinna wyglądać następująco:
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller:slugify}/{action:slugify}/{id?}", defaults: new { controller = "Home", action = "Index" }); });
W przypadku interfejsu API sieci Web ASP.NET Core 2.2:
W
ConfigureServices
metodzieStartup
zajęć:public void ConfigureServices(IServiceCollection services) { services.AddMvc(options => { options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer())); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
W przypadku ASP.NET Core> = 3,0 MVC:
W
ConfigureServices
metodzieStartup
zajęć:services.AddRouting(option => { option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer); });
Konfiguracja trasy powinna wyglądać następująco:
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" }); });
Dla ASP.NET Core> = 3.0 Web API:
W
ConfigureServices
metodzieStartup
zajęć:services.AddControllers(options => { options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer())); });
Dla ASP.NET Core> = 3.0 Razor Pages:
W
ConfigureServices
metodzieStartup
zajęć:services.AddRazorPages(options => { options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer())); })
To da
/Employee/EmployeeDetails/1
drogę do/employee/employee-details/1
źródło
employee-details
. Czy możesz mi pokazać swoją konfigurację?Jak wskazują inne odpowiedzi, dodając:
services.Configure<RouteOptions>(options => options.LowercaseUrls = true);
przed
działa świetnie, ale chcę też dodać, że jeśli używasz Identity, będziesz potrzebować również:
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(); });
I oczywiście zamień oba
IdentityUser
, awIdentityRole
razie potrzeby własnymi klasami.Właśnie przetestowałem to z .NET Core SDK 1.0.4 i środowiskiem uruchomieniowym 1.0.5.
źródło
Znalazłem rozwiązanie.
W zestawie:
Microsoft.AspNet.Routing
i wMicrosoft.Extensions.DependencyInjection
przestrzeni nazw możesz to zrobić w swojejConfigureServices(IServiceCollection services)
metodzie:services.ConfigureRouting(setupAction => { setupAction.LowercaseUrls = true; });
źródło
W przypadku tożsamości odpowiedź @Jorge Yanes Diez nie działa w
ASP.NET Core 2.2
( myślę, że 2.x ), więc jeśli używasz tożsamości i ASP.NET Core 2.2 (2.x), oto rozwiązanie:services.ConfigureApplicationCookie(options => { options.LoginPath = "/account/login"; options.ReturnUrlParameter = "returnurl"; ... });
Ref: Skonfiguruj tożsamość ASP.NET Core
źródło
Miałem to na RegisterRoutes :: RouteConfig:
route.LowercaseUrls = true;
źródło