Задать вопрос
NikFaraday
@NikFaraday
Student full-stack Developer

Как отображать маршруты в lowercase в asp.net core razor pages (mvc)?

Есть проект на asp.net core razor pages. Для страниц прописаны роуты, что-то на подобии такого:

public const string Product1 = "/products/product-1";
public const string Product2 = "/products/product-2";
public const string Product3 = "/products/product-3";


При переходе на саму страницу, адресная строка выглядит вот так:

https://localhost:5001/Products/Product-1

Даже если пробовать перейти по адресу, что представлен ниже, в адресной стоке он будет заменён на тот, что выше:

https://localhost:5001/PRODUCTS/PRODUCTS-1

Проблема в том, что есть где-то место, откуда может браться роут в таком виде. Я уже сделал несколько попыток это исправить. Конфигурация опций маршрутизации:

services.Configure<RouteOptions>(options =>
{
    options.LowercaseQueryStrings = true;
    options.LowercaseUrls = true;
});


Добавление правил роутинга:

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

Конфигурация маршрутизации на уровне middlewares:

app.UseEnpoints(endpoints =>
{
    endpoints.EnableInnerRoutes();
});


public static void EnableInnerRoutes(this IEndpointRouteBuilder endpoints)
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=home}/{action=index}/{id?}",
        defaults: new { controller = "home", action = "index" }
    )
    .WithMetadata(new RouteOptions()
    {
        LowercaseUrls = true,
        LowercaseQueryStrings = true,
    });
}


Анализ всех роутов и добавление их в список конвенций маршрутизации:

builder.AddRazorPagesOptions(options =>
{
    // ...
    foreach (var item in pageTypes)
    {
        var routes = item.GetCustomAttributes<PageRouteAttribute>();
        var pagePrefix = item.Namespace.Replace(...); // тут часть логики убрана
        var pageName = regexPageName.Replace(...); // тут часть логики убрана

        if (!string.IsNullOrEmpty(pagePrefix))
        {
            pageName = $"{pagePrefix.ToLower()}/{pageName}";
        }
    
        foreach (var routeItem in routes)
        {
            // обратите внимание, что тут абсолютно все роуты для страниц добавляются в lowercase
            options.Conventions.AddPageRoute($"/{pageName}", routeItem.RouteTemplate);
        }
    }
});


Роут аттрибут:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class PageRouteAttribute : Attribute
{
    public string RouteTemplate { get; init; }
    public PageRouteAttribute(string route)
    {
        RouteTemplate = route;
    }
}


Проблема
Как настроить отображение маршрутов в lowercase для asp.net core razor pages (mvc)?
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы