Что не так с маршрутизацией моей области в развернутом приложении bin для MVC4?
Я только что развернул приложение MVC4 .NET 4.0 на своем веб-хосте для "развернутого" развернутого тестирования. Маршруты вне зоны работают нормально, например, мой
@Html.ActionLink("Register as a Client", "Register", "Account", new { registrationType = "Client"}, null)
ссылка работает нормально, и ссылка открывает правильную страницу. Тем не менее, со ссылкой на действие на основе области, как это:
@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, null)
в ссылке, фактически отображаемой в браузере, отсутствует действие и контроллер, т.е.
http://mylivedomain.com/?Area=Author®istrationType=Author
Возможно, стоит отметить, что функция связывания css в MVC4 не работала после развертывания, и я вернулся к использованию ссылок на классические стили для отдельных таблиц стилей.
МОЖЕТ СВЯЗАТЬСЯ: Мой вопрос: почему неизмененный код шаблона в моем приложении MVC4 пытается зарегистрировать области дважды?
ТОЛЬКО В: Удаление действия по умолчанию из отображений маршрута области для маршрута по умолчанию решило эту проблему. В коде шаблона VS2012 для начала не было контроллера по умолчанию.
5 ответов
Попробуйте проверить this.ControllerContext.RouteData.DataTokens["area"] в методах действий вашей области.
У меня была ситуация с похожей проблемой, в которой имя области было просто пустой строкой.
Установка DataToken в методе действия может дать вам быстрое решение, но не отвечает на вопрос, почему MVC не устанавливает имя области.
В вашем случае, поскольку вы указываете область в строке запроса, должны применяться маршруты из Global.asax.cs. Я верю, что у вас есть что-то вроде этого:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
).DataTokens.Add("area","Author");
}
Этот код устанавливает маршрут Home/Index по умолчанию и пропускает Home/Index в URL. Если вы измените controller = "Home" на что-то другое, например controller = "Home2", вы увидите полную ссылку для Home/Index и нового маршрута по умолчанию Home2/Index. Аналогичное применяется к маршрутам по умолчанию в областях, если вы их указали.
With the @Html.ActionLink
use this format
@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, new{})
Решил мою проблему.
В вашем global.asax.cs убедитесь, что у вас есть эта строка в вашем Application_Start
:
AreaRegistration.RegisterAllAreas();
В каждой области у вас должен быть AreaRegistration.cs что-то вроде этого:
public class testAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "test";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"test_default",
"test/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
Случалось ли вам наследовать PortableAreaRegistration от MvcContrib в какой-либо из ваших областей?
Раньше у нас были точно такие же симптомы (работают локально, а не на сервере), пока мы не удалили все PortableAreaRegistrations из Portable Areas и не вернулись к использованию просто AreaRegistration, поскольку MVC4 может зарегистрировать переносную область без каких-либо дополнительных библиотек.