我在.NET框架4.5.2版本上使用ASP.NET MVC 5.2.6。
我有一个名为Admin的区域,其中我有以下内容:
namespace MyCode.Controllers
{
[RoutePrefix("admin/article")]
public class ArticleController : Controller
{
[Route("new")]
public ActionResult New()
{
return View();
}
}
}
我在Admin区域的Views\Article文件夹中还有一个名为New.cshtml的视图。
AreasAdminViewsArticleNew.cshtml
然而,当我运行我的应用程序时,MVC只在我的无区域根目录中的Views文件夹中查找。根据我过去的经验,它开始在该区域内的Views文件夹中查找。
是因为新的基于属性的路由,MVC不知道我在Admin区域内吗?
我知道我可以也不想提供每个视图的完整路径,因为这是一种痛苦。我的问题不是,我现在该何去何从?正如标题所说,它是以下内容:
有没有办法告诉它先在该地区寻找风景?
天哪!
我终于找到了解决问题的办法。如果你遇到这个问题,以下是你必须做的。
确保区域中的控制器位于与无区域根中控制器的命名空间不同的命名空间中。即使控制器名称是唯一的,也应该如此。是否使用属性路由并不重要
所以,如果你有一个面积较小的根,像这样:
根
namespace MyCode.Controllers
{
public class HomeController : Controller
{
}
}
Foo区域
namespace MyCode.Controllers
{
[RoutePrefix("whatever/it/doesnt/matter")]
public class FooController : Controller
{
}
}
你也会遇到同样的问题。像下面这样更改它,使区域的控制器位于与根的控制器分离的命名空间中,问题就会消失。
Foo区域
namespace MyCode.Areas.Foo.Controllers // or anything else other
// than the namespace where root controllers are
{
[RoutePrefix("whatever/it/doesnt/matter")]
public class FooController : Controller
{
}
}
这很可能是ASP.NET MVC源代码中的错误。
PS:
甚至RouteDebugger也告诉我,我的路由没有问题,它能够将我的路径
localhost:<port>/Admin/Article/New
解析为正确的控制器和操作,但ASP.NET MVC无法解析我的控制器和动作,并报告了404。这个从@lawphotog删除的答案有一个视频链接,帮助我解决了我的问题。