MVC 3区域路由不起作用

时间:2011-02-26 16:10:00

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

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

在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时,我收到以下错误。

  

未找到视图“索引”或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置:   〜/查看/博客/的Index.aspx   〜/查看/博客/ Index.ascx   〜/查看/共享/的Index.aspx   〜/查看/共享/ Index.ascx   〜/查看/博客/ Index.cshtml   〜/查看/博客/ Index.vbhtml   〜/查看/共享/ Index.cshtml   〜/查看/共享/ Index.vbhtml

我该如何解决这个问题?

8 个答案:

答案 0 :(得分:26)

我找到了我认为是框架中的错误,并找到了解决方法。如果您尝试将默认路由映射到具有区域的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")
 }

答案 1 :(得分:8)

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

此外,您可能没有正确设置文件夹,因为您应该进行物理设置:

  • /地区/博客
  • /地区/博客/控制器
  • /地区/博客/浏览次数

...一旦您修复了博客区域路线,您还需要:

  • / Areas / Blog / Views / Home<<将索引视图放在此处

你得到的错误似乎非常清楚地表明这是问题所在。

答案 2 :(得分:3)

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

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

RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes );

答案 3 :(得分:3)

放松!这可以节省您的阅读时间,制作咖啡并观看这个3分钟的视频,一切都将清晰。 http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas(我相信它也适用于mvc3,mvc4和mvc2035) enter image description here

答案 4 :(得分:2)

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

Phil Haacks blog提供了有关其工具状态及其变形内容的更多信息。这些评论也很好用!

答案 5 :(得分:0)

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

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

我花了4天的时间来发现它。

答案 6 :(得分:0)

我遇到了与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" });

希望它有所帮助。

答案 7 :(得分:0)

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

  

C:\ Temp C:\ Users \%用户名%\ AppData \ Local \ Microsoft \ VisualStudio   C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files   C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET   文件路径\到\ Your \ Project \ obj \ Debug