我看到两个选择:
- 明确并指定
areaName
with [RouteArea("Default", AreaPrefix = "")]
其中“默认”是您所在区域和设置的名称AreaPrefix = ""
获取应用程序根目录中的区域。
- 更改控制器所在的命名空间,以便最后一部分与您的区域名称匹配。
请注意,如果您所在区域的前缀是根(“”),则您的操作需要非常明确[Route("...")]
属性,这样它们就不会贪婪地声明您应用程序中的所有路由,并让您因其他一系列原因而摸不着头脑。
背景
当。。。的时候RouteAreaAttribute
被应用而不提供areaName
or the areaName
提供的是 null 你可能会得到这个奇怪的错误,或者你的操作可能使用不正确的视图(例如,如果你创建了~/Views/Shared/Index.cshtml
出于其他目的)。
The RouteAreaAttribute.AreaName http://msdn.microsoft.com/en-us/library/system.web.mvc.routeareaattribute.areaname(v=vs.118).aspx文档很有帮助:
(AreaName 属性)获取要为控制器中定义的所有路由设置的区域名称。如果该值为空,将尝试从目标控制器的命名空间推断区域名称。
通过应用[RouteArea]
到您的控制器areaName
默认为 null,这会导致某些逻辑接管,“从目标控制器的命名空间推断区域名称”。显然,推断涉及到获取命名空间的最后一部分,传统上该部分是“控制器”,因为 MVC 开发人员被教导在 Controllers 文件夹中创建控制器,并且默认情况下 Visual Studio 根据文件夹结构确定 C# 类的命名空间。
为了证明我的观点,您可以更改 DefaultController 的命名空间MyProject.Areas.Default.Controllers
to MyProject.Areas.Default
,砍掉“.Controllers”。如果您重建并访问该操作,它将在“Areas/Default”文件夹下查找视图,就像我们所期望的那样:
~/Areas/Default/Views/Default/Index.aspx
~/Areas/Default/Views/Default/Index.ascx
...
而不是像没有人期望的那样在“Areas/Controllers”文件夹下:
~/Areas/Controllers/Views/Default/Index.aspx
~/Areas/Controllers/Views/Default/Index.ascx
...
我明白为什么开发人员选择这样做,但不幸的是他们忽略了我们被教导如何组织 ASP.NET MVC 代码以及 Visual Studio 如何向项目添加区域和控制器。这并不完全是一个错误,而是比这更微妙和令人沮丧的东西。