如何在 Razor ASP.NET MVC 中注册/指定视图的自定义目录






3.71/5 (6投票s)
在 ASP.NET MVC 中注册视图的自定义目录
引言
在 ASP.NET MVC 中,默认情况下,当我们创建一个应用程序时,我们的视图位于控制器操作的 Views 目录中。 例如,默认情况下它会创建一个带有 Index 操作的 Home 控制器,如果我们查看解决方案资源管理器中的 Views 目录,我们可以看到目录 Views -->> Home --> Index.cshtml,我们有这样的操作
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
并且我们在 Views 文件夹中拥有此操作的视图。 请看下面的屏幕
现在默认情况下,它将首先在 Views/Home 文件夹中查找 Index.cshtml 文件,如果无法在那里找到它,则会在 View/Shared 文件夹中找到它,如果仍然找不到它,它将抛出一个异常,提示找不到视图文件,以下是抛出的异常文本
The view 'Index' or its master was not found or no view engine supports the searched locations.
The following locations were searched:
~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
参见
return PartialView()
时,部分视图的情况也是如此。 它首先在各自控制器的 Views/Home 目录中查找(在 HomeController
的情况下),如果失败,则在 View/Shared 文件夹中查找。使用自定义目录
现在,如果我在我的 Views 文件夹和 Shared 文件夹中为部分视图创建一个单独的目录,例如
Views/Home/Partials 和 Views/Shared/Partial,那么我们必须告诉 ViewEngine
也要在那个目录中查找,方法是在 Global.asax 文件的 Application_Start
事件中编写以下代码。
例如,我有这段代码,并且我从 HomeController
的 Index
操作返回 _LoginPartial.cshtml,现在会发生什么呢?它会首先在 View/Home 目录中查找,如果失败,它会在 View/Shared 中查找,但是这次,我为每个控制器以及 shared,将我的部分视图放在一个单独的名为 Partial 的目录中,在这种情况下,HomeController
的部分视图位于 Views/Home/Partials 和 Views/Shared/Partials 中
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
在这种情况下,我也会得到相同的异常,因为 Engine 将无法找到视图文件 _LoginPartial.cshtml。
ASP.NET MVC Framework 的美妙之处在于它的可扩展性,您可以根据您的需求和业务要求进行扩展,其中之一是如果您想要自己的目录结构来组织您的视图,您可以向 Razor 视图引擎注册这些目录,这样做可以简化您的生活,因为您不必指定视图的完全限定路径,因为 Razor 会知道它需要在那些您已注册的目录中查找视图。
因此,我们需要做的是在应用程序中注册这个目录模式,以便每次它调用任何 View
时,它也应该在那些我们放置 View 文件的目录中查找。 这是代码
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
if (razorEngine != null)
{
var newPartialViewFormats = new[]
{
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
};
razorEngine.PartialViewLocationFormats =
razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
}
}
}
现在,无论何时我们调用 return PartialView("SomeView")
,它都会在控制器视图目录名为 Partials 的子目录中查找,如果找不到,它会在 Views/Shared 和 Views/Shared/Partials 中查找。
关注点
我们看到了如何在获取视图时也包含其他目录。 以同样的方式,您可以注册其他目录或您自己的自定义目录结构(如果需要),因此,以这种方式执行此操作,您将无需指定完整路径,例如 return View("~/Views/Shared/Partials/Index.cshtml")
。 相反,如果您想加载 Index 视图,并且您的操作名称也是被调用的 Index,或者如果您想渲染一些其他视图或者调用了一些其他操作并且您想返回 Index 视图,那么您可以直接编写 return View()
或者现在您可以编写 return View("Index")
。