Ответ 1
Это ошибка, связанная с MVC4, и будет исправлена в версии MVC5. Routes.LowercaseUrls
не влияет на области. Подробнее здесь.
Между тем вы можете использовать LowercaseRoutesMVC или LowercaseRoutesMVC4, если вам нужна поддержка WebApi.
У меня возникают проблемы с настройкой маршрутов по умолчанию. По какой-то причине это не работает. Я знаю, что я могу установить 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/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;
не будет иметь никакого эффекта, где мы должны сообщать об этом или как мы можем исправить это?
Это ошибка, связанная с MVC4, и будет исправлена в версии MVC5. Routes.LowercaseUrls
не влияет на области. Подробнее здесь.
Между тем вы можете использовать LowercaseRoutesMVC или LowercaseRoutesMVC4, если вам нужна поддержка WebApi.
Я попробовал Несколько попыток получить этот конкретный логический флаг для работы с проектом MVC3 без везения. ТОЛЬКО, я мог заставить его работать, это создать проект приложения MVC4 и установить флаг в файле RouteConfig.cs в начале приложения. Действительно плохая часть - это низкое расположение URL-адресов на сайте автоматически для меня, пока я не добавил область, а затем повредил ее везде. Как только я исключил добавленную область из проекта и повторно запустил, URL-адреса снова были снижены.
Что-то выиграно с использованием этого флага. Я бы порекомендовал загрузить пакет nuget для нижних индексов. Кажется, что они не совсем выработали изломы в этой части новой структуры.
Извините, я не могу больше помочь.
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-адрес в нижнем регистре.
Как я знал, LowercaseUrls = true
доступен только в .NET4.5, возможно, вы можете просто написать некоторые расширения для строчных URL-адресов. вы можете ссылаться на делая URL-адрес в нижнем регистре. Любой простой или встроенный способ для подробной информации.