也许我不正确地理解MVC Areas的工作原理,但这使我有些困惑。
因此,在这一点上,如果您启动应用程序并导航至/MyArea/,则应使用其匹配的 View 加载AnArea Controller 。如果导航到/MyArea/AnArea,它将显示相同的结果。
但是,如果导航到/AnArea/,则仍会找到 Controller ,并显示以下错误消息:
The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/anarea/Index.aspx
~/Views/anarea/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/anarea/Index.cshtml
~/Views/anarea/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
这是正确的行为吗?我本以为一个区域的 Controller 只能通过它自己的区域而不是全局来访问。
最佳答案
每当我创建一个具有区域的项目时,都会按以下方式更改Default
路线:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // defaults
null, // constraints
new string[] { "MyApplication.Controllers" } // namespaces
);
最后一个参数将限制到
MyApplication.Controllers
命名空间中的 Controller 的默认路由。这样可以确保默认路由仅限于任何区域之外的操作。更新
深入研究代码后,我发现了问题所在,并找到了解决方案。将您的默认路由更改为以下内容:
routes.Add(
"Default",
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
),
null,
new RouteValueDictionary(
new {
Namespaces = new string[] { "MyApplication.Controllers" },
UseNamespaceFallback = false
}
),
new MvcRouteHandler()
)
);
关键在于添加
UseNamespaceFallback
token 。这将防止“默认”路由查看任何其他 namespace 。这是意外行为,这是我不知道的问题,它会影响我正在处理的项目。我将在aspnet.codeplex.com上将其列为问题。我不会将其称为错误,但是这种行为肯定似乎违反了MVC路由的要求。