我刚刚在我的网络主机上部署了一个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
值得注意的是,MVC4的css捆绑功能在部署后无法正常工作,我回过头来使用经典样式链接到各个样式表。
可能相关:我的问题:Why is unmodified template code in my MVC4 app trying to register areas twice?
JUST IN:从默认路由的区域路由映射中删除默认操作解决了此问题。在VS2012模板代码中没有默认控制器。
答案 0 :(得分:2)
尝试在您所在区域的操作方法中检查this.ControllerContext.RouteData.DataTokens [“area”]。
我遇到类似问题的情况,其中区域名称只是一个空字符串。
在action方法中设置DataToken可能会为您提供快速修复,但它没有回答为什么MVC没有设置区域名称的问题。
答案 1 :(得分:2)
在您的情况下,因为您在查询字符串中指定了区域,所以应该应用来自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默认路由,并在url中跳过Home / Index 。如果您在其他内容上更改controller =“Home”,例如controller =“Home2”,您将显示Home / Index和新默认路径Home2 / Index的完整链接。如果您指定了默认路由,则类似适用于区域中的默认路由。
答案 2 :(得分:1)
在您的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 }
);
}
}
答案 3 :(得分:1)
使用@ Html.ActionLink
使用此格式
@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, new{})
解决了我的问题。
答案 4 :(得分:0)
您是否碰巧在任何领域从MvcContrib继承了PortableAreaRegistration?
我们曾经有过完全相同的症状(在本地工作,不在服务器上工作),直到我们从Portable Areas中删除所有PortableAreaRegistrations并恢复为简单使用AreaRegistration,因为MVC4可以注册一个没有任何附加库的可移植区域。