Как вы применяете строчную маршрутизацию в ASP.NET Core?
В ASP.NET 4 это было так же просто, как routes.LowercaseUrls = true;
в обработчике RegisterRoutes
для приложения.
Я не могу найти эквивалент в ASP.NET Core для достижения этой цели. Я думаю, что это будет здесь:
app.UseMvc(configureRoutes =>
{
configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});
Но ничто в configureRoutes
позволяет это сделать... разве есть метод расширения, который я не могу найти в документации?
Ответы
Ответ 1
Для ядра ASP.NET:
Добавьте следующую строку в метод ConfigureServices
класса Startup
.
services.AddRouting(options => options.LowercaseUrls = true);
Спасибо Скорунке за ответ в качестве комментария. Я думал, что это стоит того, чтобы дать реальный ответ.
Ответ 2
Найден решение.
В сборке: Microsoft.AspNet.Routing
и пространстве имен Microsoft.Extensions.DependencyInjection
вы можете сделать это в своем методе ConfigureServices(IServiceCollection services)
:
services.ConfigureRouting(setupAction =>
{
setupAction.LowercaseUrls = true;
});
Ответ 3
Как показывают другие ответы, добавив:
services.Configure<RouteOptions>(options => options.LowercaseUrls = true);
перед
services.AddMvc(...)
отлично работает, но я также хочу добавить, что если вы используете Identity, вам также понадобится:
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();
});
И, очевидно, замените как IdentityUser
, так и IdentityRole
вашими собственными классами, если это необходимо.
Я только что протестировал это с .NET Core SDK 1.0.4 и 1.0.5.
Ответ 4
Обновление в ASP.NET Core 2.2
В ASP.NET Core 2.2 наряду со строчными буквами вы также можете сделать пунктирным свой маршрут, используя ConstraintMap
который сделает ваш маршрут /Employee/EmployeeDetails/1
в /employee/employee-details/1
вместо /employee/employeedetails/1
.
Для этого в методе ConfigureServices
класса Startup
:
services.AddRouting(option =>
{
option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
option.LowercaseUrls = true;
});
И класс SlugifyParameterTransformer
должен быть следующим:
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();
}
}
И конфигурация маршрута должна быть следующей:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller:slugify}/{action:slugify}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
Это сделает /Employee/EmployeeDetails/1
маршрут к /employee/employee-details/1
Ответ 5
Для идентификации @Jorge Yanes Diez ответ не работает в ASP.NET Core 2.2
(я думаю, 2.x), поэтому, если вы используете Identity и ASP.NET Core 2.2 (2.x), вот решение:
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/account/login";
options.ReturnUrlParameter = "returnurl";
...
});
Ссылка: настройка удостоверения ядра ASP.NET