Как обеспечить принудительную маршрутизацию в нижнем регистре в ASP.NET Core?


90

В ASP.NET 4 это было так же просто, как и routes.LowercaseUrls = true;в RegisterRoutesобработчике приложения.

Я не могу найти эквивалент в ASP.NET Core для этого. Думаю, это будет здесь:

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

Но ничто во configureRoutesвнешности не позволяет это ... разве что где-то есть метод расширения, который я не могу найти в документации?

Ответы:


192

Для ASP.NET Core:

Добавьте следующую строку в ConfigureServicesметод Startupкласса.

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

Спасибо Скорунке за ответ в виде комментария. Я подумал, что стоит продвигать настоящий ответ.


35
Стоит отметить, что вы должны указать это ДО того, как вы действительно вызовете AddMvc()свой Startup.ConfigureServices()метод. AddRouting()который также вызывается, AddMvc()использует Tryварианты методов для добавления зависимостей в вашу коллекцию сервисов. Поэтому, когда он увидит, что зависимости маршрутизации уже добавлены, он пропустит эти части AddMvc()логики настройки.
Ник Альбрехт

Переключение этого на правильный ответ, поскольку мой был во время перехода asp 4 на core.
mariocatch

32

Обновление в версии ASP.NET Core> = 2.2

Из ASP.NET Ядра 2.2 , наряду с строчными вы также можете сделать свой маршрут пунктирным , используя ConstraintMapкоторый сделает свой маршрут , /Employee/EmployeeDetails/1чтобы /employee/employee-details/1вместо /employee/employeedetails/1.

Для этого сначала 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();
    }
}

Для ASP.NET Core 2.2 MVC:

В ConfigureServicesметоде Startupкласса:

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

А конфигурация маршрута должна быть следующей:

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

Для веб-API ASP.NET Core 2.2:

В ConfigureServicesметоде Startupкласса:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => 
    {
        options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Для ASP.NET Core> = 3.0 MVC:

В ConfigureServicesметоде Startupкласса:

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

А конфигурация маршрута должна быть следующей:

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

Для веб-API ASP.NET Core> = 3.0:

В ConfigureServicesметоде Startupкласса:

services.AddControllers(options => 
{
    options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
});

Для ASP.NET Core> = 3.0 Razor Pages:

В ConfigureServicesметоде Startupкласса:

services.AddRazorPages(options => 
{
    options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer()));
})

Это проложит /Employee/EmployeeDetails/1путь к/employee/employee-details/1


Я пробовал этот код и официальный код Microsoft, но преобразователь параметров "slugify" не действует. Он просто игнорируется системой маршрутизации (поэтому URL-адреса не заменяются пунктирными). Чтобы проверить себя, я поместил регистратор в метод TransformOutbound (), но никаких вызовов оттуда.
user3172616

Ладно! Дайте проверить, пожалуйста!
TanvirArjel

@ user3172616 Я проверил прямо сейчас! он работает, как ожидалось! как создание маршрута как employee-details. Не могли бы вы показать мне свою конфигурацию?
TanvirArjel

@ user3172616 используете ли вы маршрутизацию атрибутов на маршруте, который вы тестировали?
TanvirArjel

Я использую стандартный подход к маршрутизации (а не маршрутизацию атрибутов) в новом решении ядра v2.2 в Visual Studio. Есть два скриншота (код C # и код .cshtml). Пытался сгенерировать ссылки разными способами, но безуспешно. imgur.com/a/L8dCF6c
user3172616

20

Как указывают другие ответы, добавление:

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.


Настроить <RouteOptions> () - лучший ответ imho: крошечный и сразу по
делу

12

Нашел решение.

В сборке: Microsoft.AspNet.Routingи Microsoft.Extensions.DependencyInjectionпространстве имен вы можете сделать это в своем ConfigureServices(IServiceCollection services)методе:

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

15
Для ASP NET MVC CORE: services.AddRouting (options => {options.LowercaseUrls = true;});
Скорунка Франтишек

Microsoft.Extensions.DependencyInjection в Microsoft.AspNetCore.Routing.dll
Скорунка Франтишек

3
Так было до RTM, теперь вы должны использовать .AddRouting вместо .ConfigureRouting
Ив Шелпе


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.