Подтвердить что ты не робот

"routes.LowercaseUrls = true;" не работает?

У меня возникают проблемы с настройкой маршрутов по умолчанию. По какой-то причине это не работает. Я знаю, что я могу установить authorize и home в нижнем регистре, но часть Admin (область) будет по-прежнему заглавной.

@Html.ActionLink("Hello World", "Authorize", "Home")

выходы на

<a href="/Admin/Home/Authorize">Hello World</a>

Маршрут области

public override void RegisterArea(AreaRegistrationContext context)
        {
            context.Routes.LowercaseUrls = true;
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new string[] { "OR.Areas.Admin.Controllers" }
            );
            context.Routes.LowercaseUrls = true;
        }

Маршрут по умолчанию

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.LowercaseUrls = true;
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.LowercaseUrls = true;
            routes.MapRoute(
                name: "Localization",
                url: "{lang}/{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "OR.Controllers" }
            );
            routes.LowercaseUrls = true;
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "OR.Controllers" }
            );

            routes.LowercaseUrls = true;
        }

Конфигурации Admin Area Я пробовал

// admin/Home/Authorize
public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.LowercaseUrls = true;
    context.MapRoute(
        "Admin_default",
        "{area}/{controller}/{action}/{id}",
        new { area = "admin", controller = "home", action = "Index", id = UrlParameter.Optional },
        new string[] { "ORMebeles.Areas.Admin.Controllers" }
    );
    context.Routes.LowercaseUrls = true;
}

// admin/Home/Authorize
public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.LowercaseUrls = true;
    context.MapRoute(
        "Admin_default",
        "admin/{controller}/{action}/{id}",
        new { controller = "home", action = "Index", id = UrlParameter.Optional },
        new string[] { "ORMebeles.Areas.Admin.Controllers" }
    );
    context.Routes.LowercaseUrls = true;
}

Изменить

Как кажется, это ошибка с MVC4 - когда вы устанавливаете context.Routes.LowercaseUrls = true;, и у вас есть область/области context.Routes.LowercaseUrls = true; не будет иметь никакого эффекта, где мы должны сообщать об этом или как мы можем исправить это?

4b9b3361

Ответ 1

Это ошибка, связанная с MVC4, и будет исправлена ​​в версии MVC5. Routes.LowercaseUrls не влияет на области. Подробнее здесь.

Между тем вы можете использовать LowercaseRoutesMVC или LowercaseRoutesMVC4, если вам нужна поддержка WebApi.

Ответ 2

Я попробовал Несколько попыток получить этот конкретный логический флаг для работы с проектом MVC3 без везения. ТОЛЬКО, я мог заставить его работать, это создать проект приложения MVC4 и установить флаг в файле RouteConfig.cs в начале приложения. Действительно плохая часть - это низкое расположение URL-адресов на сайте автоматически для меня, пока я не добавил область, а затем повредил ее везде. Как только я исключил добавленную область из проекта и повторно запустил, URL-адреса снова были снижены.

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

Извините, я не могу больше помочь.

Ответ 3

UPDATE: В приложении MVC4

Создайте новое пустое приложение MVC4 и добавьте тест, вызванный зоной, с тестом Test.cshtml и контроллером TestController.cs.

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

namespace MvcApplication1.Areas.Test
{
public class TestAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Test";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        //This line breaks the functionality in the area registration.
        context.MapRoute(
            "Test_default", // Route name
            "Test/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
            new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
            );
    }
}
}

Обходной путь:

Прокомментируйте строки

        //context.Routes.LowercaseUrls = true;
        //context.MapRoute(
        //    "Test_default", // Route name
        //    "Test/{controller}/{action}/{id}", // URL with parameters
        //    new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
        //    new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
        //    );

В RouteConfig.cs

namespace MvcApplication1
{
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.LowercaseUrls = true;

        routes.MapRoute(
            "Default", 
            "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            "Test_default", // Route name
            "Test/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
            new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
            );
    }
}
}

В методе действия контроллера зоны

    public ActionResult Index()
    {
        // Key if statement to make sure the area maps correctly
        if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area"))
        {
            this.ControllerContext.RouteData.DataTokens.Add("area", "Test");
        }
        return View("Test");
    }

Результат HTML для ссылок на главной странице проекта

 <ul id="menu">
   <li><a href="/">Home</a></li>
   <li><a href="/home/about">About</a></li>
   <li><a href="/home/contact">Contact</a></li>
   <li><a href="/test?area=Test">Test</a></li>
 </ul>

Обратите внимание, однако, что строковые переменные запроса не находятся в нижней части, и это не дружественный URL-адрес. Однако он находит вид. Это так близко, что я смог воспользоваться этим флагом и иметь URL-адрес в нижнем регистре.