Як застосовувати малі регістри в 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()який також викликається by AddMvc()використовує Tryваріанти методів для додавання залежностей до вашої колекції послуг. Отже, коли він побачить, що залежності маршрутизації вже додані, він пропустить ці частини AddMvc()логіки налаштування.
Нік Альбрехт,

Переключення цього на правильну відповідь, оскільки мій був під час переходу asp 4 до основного.
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" });
});

Для ASP.NET Core> = 3.0 Web API:

У 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: крихітний і прямий (тестований на ядрі mvc 3.1)
T-moty

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 in Microsoft.AspNetCore.Routing.dll
Skorunka František

3
Це було правдою до RTM, тепер вам слід використовувати .AddRouting замість .ConfigureRouting
Yves Schelpe

1

Що стосується ідентичності, відповідь @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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.