Как вы применяете строчную маршрутизацию в 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