【问题标题】:How do I make MVC look into the Views folder within my area first before looking into the area-less root's Views folder?在查看无区域根目录的 Views 文件夹之前,如何让 MVC 先查看我所在区域内的 Views 文件夹?
【发布时间】:2018-12-07 06:21:38
【问题描述】:

我在 .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 的视图。

Areas\Admin\Views\Article\New.cshtml

但是,当我运行我的应用程序时,MVC 只在我的无区域根目录中的 Views 文件夹中查找。根据我过去的经验,它开始查看该区域内的 Views 文件夹。

是不是因为新的基于属性的路由MVC不知道我在Admin区域内?

我知道我可以,但我不想提供每个视图的完整路径,因为这很让人头疼。我的问题不是,我现在从这里去哪里?正如标题所说,它是:

有没有办法让它先在该区域寻找视图?

【问题讨论】:

  • 听起来像RouteAreaAttribute 和设置自定义视图引擎以查找特定区域的视图是实现这一目标的必要方法,但仍不能完全确定。

标签: asp.net-mvc asp.net-mvc-5


【解决方案1】:

天哪!

我终于找到了解决问题的方法。如果您遇到此问题,请执行以下操作。

确保您的区域中的控制器位于与您的无区域根中的控制器的命名空间不同的命名空间中。即使控制器名称是唯一的,也应该如此。是否使用属性路由并不重要。

所以,如果你有一个像这样的无区域根:

namespace MyCode.Controllers
{
  public class HomeController : Controller
  {
  }
}

美食区

namespace MyCode.Controllers
{
  [RoutePrefix("whatever/it/doesnt/matter")]
  public class FooController : Controller
  {
  }
}

你会遇到同样的问题。像下面这样改变它,使区域的控制器驻留在与根的不同的命名空间中,问题就会消失。

美食区

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:

  1. 即使 RouteDebugger 告诉我我的路由没有问题,它能够将我的路径 localhost:<port>/Admin/Article/New 解析到正确的控制器和操作,但 ASP.NET MVC 无法解析我的控制器并采取行动并报告 404。

  2. 来自@lawphotog 的这个deleted answer 有一个指向a video 的链接,它帮助我解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多