MVC 3区域路由不起作用

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

当我转到以下URL 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

我该如何解决这个问题?

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

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

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

…一旦你修复了你的博客区域路线,你还需要:

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

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

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

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

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

 RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes ); 

放松! 这可以为您节省数小时的阅读时间,制作咖啡并观看这个3分钟的video,一切都将清晰。 http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas (我相信它也适用于mvc3,mvc4和mvc2035) 在此处输入图像描述

继Mortens回答之后 ,您现在可以NuGet(或手动下载并安装)提供此function的RouteMagic或Glimpse软件包等等。

Phil Haacks博客提供了有关其工具状态及其变形的更多信息。 这些评论也有助于阅读!

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

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

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

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

希望它可以帮到某人。

只是尝试删除此处提到的以下目录中的内容并重建项目

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 Files Path \ To \ Your \ Project \ obj \ Debug