也许我不能正确理解MVC区域是如何工作的,但这让我有些困惑。
所以此时如果启动应用程序并导航到/ MyArea /它应该加载AnArea控制器及其匹配视图。如果您导航到/ MyArea / AnArea,它将显示相同的结果。
但是,如果您导航到/ AnArea /,仍然会找到控制器并显示以下错误消息:
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
这是正确的行为吗?我原以为区域的控制器只能通过它自己的区域访问,而不是全局访问。
答案 0 :(得分:6)
每当我创建一个包含区域的项目时,我都会按如下方式更改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
命名空间中控制器的默认路由。这可以确保默认路由仅限于任何区域之外的操作。
<强>更新强>
深入研究代码后,我发现了问题出现的地方,并找到了解决方案。将您的默认路由更改为以下内容:
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
令牌。这将阻止Default路由查看任何其他名称空间。
这是意外的行为,这是一个我不知道哪个影响我正在处理的项目的问题。我将在aspnet.codeplex.com上将其列为问题。我不会称这是一个错误,但这种行为肯定会破坏MVC路由的对话。
答案 1 :(得分:0)
您必须在区域和一般路线中应用命名空间限制。
在global.asax.cs中,您应该像这样编辑RegisterRoutes方法
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "MyProject.Controllers" }
);
}
这将仅将“//”限制为命名空间“MyProject.Controllers”
但是你也必须将名称空间限制应用于区域,以仅将“//”限制为名称空间“MyProject.Areas.MyArea.Controllers”
为此,您必须编辑“MyAreaAreaRegistration.cs”的“RegisterArea”方法,如下所示(“MyAreaRegistration.cs”位于“/ MyProject / Areas / MyArea”文件夹中):
//Some default code stuff
...
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"MyArea_default",
"MyArea/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new string[] { "MyProject.Areas.MyArea.Controllers" }
);
}
希望它有所帮助!!
答案 2 :(得分:0)
您似乎正在导航到/AnArea
而您的区域名为MyArea
,因此您应该导航到/MyArea/
。以下是区域路线注册的方式:
context.MapRoute(
"MyArea_default",
"MyArea/{controller}/{action}/{id}",
new { controller = "AnArea", action = "Index", id = UrlParameter.Optional }
);
AnArea
是控制器的名称,而不是区域。如果您想要导航到此区域的某个控制器,您应该始终在您的网址前加MyArea
作为该区域的名称。