【问题标题】:MVC 3 Area route not workingMVC 3区域路线不起作用
【发布时间】:2011-07-04 22:07:34
【问题描述】:

我在我的 MVC 3 应用程序中创建了一个名为“博客”的区域。

在 global.asax 我有以下代码。

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

    }

这是我所在区域的代码

public class BlogAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Blog"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Blog_default",
            "Blog/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

当我转到以下网址 http://localhost/CMS/blog 时,我收到以下错误。

未找到视图“索引”或其主视图,或者没有视图引擎支持搜索到的位置。搜索了以下位置: ~/Views/blog/Index.aspx ~/Views/blog/Index.ascx ~/Views/Shared/Index.aspx ~/Views/Shared/Index.ascx ~/Views/blog/Index.cshtml ~/Views/blog/Index.vbhtml ~/Views/Shared/Index.cshtml ~/Views/Shared/Index.vbhtml

我该如何解决这个问题?

【问题讨论】:

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0


【解决方案1】:

我正在使用 Phil Haack 的 routedebugger 来解决此类问题。它方便地显示所有已注册的路由以及输入的 URL 如何与您的配置匹配。

它通过覆盖常规应用程序流来工作,您可以通过在 Application_Start 的末尾添加此行来启用它:

RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes );

【讨论】:

  • 好的,我该如何解决我的博客路由没有被我的routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); 路由捕获
  • 先看看你所在区域的路由是否被routedebugger显示。如果不是,则 RegisterAllAreas 没有被调用或不起作用。如果它们被列出,但像“/blog/ctrl/act”这样的 url 与您的博客区域路由不匹配,这是一个不同的问题。请注意,我有“dataTokens: new { area = "blog" }" 作为我的区域注册的附加参数,但如果我没记错的话,这是 MvcFutures 的要求。如果东西不起作用,值得尝试。
  • @MortenMertner :我正在检查 DatTokens 中的 Controller Context 属性。当我在根目录Controller 中时,我发现DataToken's 键计数= 0。这是事实吗?
【解决方案2】:

Mortens answer 开始,您现在可以 NuGet(或手动下载并安装)提供此功能的 RouteMagicGlimpse 包,等等。

更多信息请访问Phil Haacks blog,了解有关他的工具状态及其演变的内容。 cmets 也有助于阅读!

【讨论】:

    【解决方案3】:

    我发现了我认为是框架中的错误,并提供了解决方法。如果您尝试将默认路由映射到带有区域的 MVC 3 应用程序,您的 global.asax 文件可能具有以下内容:

    VB:

    routes.MapRoute(
          "Default",
          "{area}/{controller}/{action}/{id}",
          New With {.area = "MyArea", .controller = "Home", .action = "Index", .id = UrlParameter.Optional}
    )
    

    C#:

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

    如果您在 URL 中转到您的应用根目录,您可能会收到如下运行时错误:

    未找到视图“索引”或其主视图,或者没有视图引擎支持搜索到的位置。搜索了以下位置:

    由于某种原因,视图引擎似乎不会在区域文件夹中查找视图文件,就像您键入整个链接一样。奇怪的是代码到达控制器动作。解决方法如下:将此代码放入您的控制器操作中:

    VB:

    If Not Me.ControllerContext.RouteData.DataTokens.ContainsKey("area") Then
                    Me.ControllerContext.RouteData.DataTokens.Add("area", "MyArea")
                End If
    

    C#

      if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area"))
    {
            this.ControllerContext.RouteData.DataTokens.Add("area", "MyArea")
     }
    

    【讨论】:

    • 这对于区域之间的路由也很有用。例如ControllerContext.ParentActionViewContext....等
    • @MindstormInterface :我正在检查 DatTokens 中的 Controller Context 属性。当我在根目录Controller 中时,我发现DataToken's 键计数= 0。这是事实吗?
    • @PKKG 是的,我刚刚对此进行了测试并得到了相同的结果。框架应该提供来自全局 asax 的默认值。也许全局设置不正确,但在所有示例中都是如此,并且控制器中的修复工作有效,所以我没有详述。
    【解决方案4】:

    您所在地区的注册似乎有误。您为操作指定默认值,但没有为控制器指定默认值。由于您通常将 Home 作为控制器的名称,因此您需要指定它。

    也可能是您的文件夹设置不正确,因为您应该进行物理设置:

    • /区域/博客
    • /区域/博客/控制器
    • /区域/博客/视图

    ...一旦您确定了您的博客区域路线,您还需要:

    • /Areas/Blog/Views/Home

    您得到的错误似乎很清楚地表明这是问题所在。

    【讨论】:

    • 我希望 VS 工具能够为我们创建它:-( new { controller="Home", action = "Index", id = UrlParameter.Optional }
    • 你好@Peter:我正在检查控制器上下文中的 DatTokens。当我在根目录控制器中时,我发现 DataToken 的密钥计数 = 0。这是事实吗?
    • @PKKG - DataTokens 是您在注册路由时指定的值,并非来自 URL。尝试查看控制器上下文的 RouteValues 集合 - 这些是在路由中指定并从 URL 匹配的值。
    【解决方案5】:

    放松!这可以为您节省数小时的阅读时间、冲杯咖啡并观看这个 3 分钟的视频,一切都会让您一目了然。 http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas(我相信它也适用于 mvc3、mvc4 和 mvc2035)

    【讨论】:

    • 我正在检查Controller Context 属性中的DatTokens。当我在根目录Controller 中时,我发现DataToken's 键计数= 0。这是事实吗?
    【解决方案6】:

    检查是否有一个虚拟路径被映射为区域名称。我在 Visual Studio 中设置区域地址只是为了调试,它要求我创建一个虚拟路径。所以 AppRelativeCurrentExecutionFilePath 总是 ~/ 并且路由无法确定区域。对于 IIS express,删除您站点的虚拟路径:

    C:\Users\username\Documents\IISExpress\config\applicationhost.config
    

    我花了 4 天时间才发现它。

    【讨论】:

      【解决方案7】:

      我遇到了与 Mindstorm Interactive 相同的问题,并采取了稍微不同的方法。是的,它确实重定向了用户,但可以这么说,它让我的代码看起来不那么灵活。

      无论在哪个区域,我都创建了一个新控制器,因为问题在于渲染器内部没有找到视图,而不是控制器。

      然后控制器重定向包含的区域(如 Mindstroms 修复中的密钥),瞧。

      public class StartController : Controller
      {
        public ActionResult Index()
        {
          return RedirectToAction("Index", "MyController", new { area = "MyArea" });
        }
      }
      

      只需在 RouteConfig 中添加

      routes.MapRoute(name: "Root", url: "", defaults: new { controller = "Start", action = "Index", area = "MyArea" });
      

      希望对某人有所帮助。

      【讨论】:

        【解决方案8】:

        尝试从here提到的以下目录中删除内容并重建项目

        C:\Temp C:\Users\%Username%\AppData\Local\Microsoft\VisualStudio C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET 文件 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET 文件路径\To\Your\Project\obj\Debug

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-22
          • 1970-01-01
          • 1970-01-01
          • 2018-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多