【问题标题】:What is wrong with my area routing in my bin deployed MVC4 app?我的 bin 部署的 MVC4 应用程序中的区域路由有什么问题?
【发布时间】:2012-07-16 21:05:42
【问题描述】:

我刚刚将 MVC4 .NET 4.0 应用程序部署到我的 Web 主机,用于“实时”部署测试。非区域路线运行良好,例如我的

@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&registrationType=Author

可能值得注意的是,MVC4 的 css 捆绑功能在部署后不起作用,我回滚到使用经典样式链接到单个样式表。

可能相关:我的问题:Why is unmodified template code in my MVC4 app trying to register areas twice?

JUST IN:从默认路由的区域路由映射中删除默认操作解决了这个问题。在 VS2012 模板代码中没有默认的控制器开始。

【问题讨论】:

  • 您是否忘记在 ActionLink() 末尾使用 new{}stackoverflow.com/questions/2036305/…
  • @NickDeVore,我使用的是null,这在我的开发机器上适用于我,并且之前在我正在部署的我的站点的前一个 MVC3 版本上工作。
  • 听起来不错,我刚刚发现其他问题和答案似乎暗示现在需要它?无论如何,只是一个想法。
  • 是您整个项目中该作者区域中唯一的“HomeController”吗?我在项目中收到多个 HomeController 的错误,但也许您以某种方式抑制了该错误?
  • @jaminto 我在项目的每个区域都有一个 HomeController,我绝对不会抑制我知道的错误。就像我说的,这一切都在我的开发机器上运行,只有在我部署时才会出现问题。

标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-4 asp.net-mvc-areas


【解决方案1】:

尝试在您所在区域的操作方法中检查 this.ControllerContext.RouteData.DataTokens["area"]。

我遇到过类似问题的情况,其中区域名称只是一个空字符串。

在 action 方法中设置 DataToken 可能会为您提供快速修复,但它不能回答为什么 MVC 不设置区域名称的问题。

【讨论】:

    【解决方案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。如果您在其他内容上更改控制器 =“Home”,例如控制器 =“Home2”,您将显示 Home/Index 的完整链接和新的默认路由 Home2/Index。如果您指定了区域中的默认路线,类似的情况也适用。

    【讨论】:

    • 显式添加数据令牌会导致“已添加具有相同键的项目”。例外。
    【解决方案3】:

    在您的 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 }
            );
        }
    }
    

    【讨论】:

    • 该代码作为项目/项目模板的一部分自动添加。
    【解决方案4】:

    使用@Html.ActionLink

    使用这种格式

    @Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, new{})
    

    解决了我的问题。

    【讨论】:

      【解决方案5】:

      您是否碰巧在您的任何区域从 MvcContrib 继承 PortableAreaRegistration?

      在我们从 Portable Areas 中删除所有 PortableAreaRegistration 并恢复为简单地使用 AreaRegistration 之前,我们曾经有完全相同的症状(在本地工作,而不是在服务器上工作),因为 MVC4 可以在没有任何额外库的情况下注册一个便携式区域。

      【讨论】:

      • 我根本没有使用 MvcContrib。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2020-11-06
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多