MVC4 Razor自定义视图定位器
我正在开发一个MVC4应用程序,该应用程序旨在为两个域提供服务。我们的大部分内容将在域之间共享,但有时我们需要根据请求来自哪个站点呈现不同的标记(使用Razor) 理想情况下,我需要一种基于约定的方法,允许我拥有如下文件夹结构:MVC4 Razor自定义视图定位器,razor,asp.net-mvc-4,Razor,Asp.net Mvc 4,我正在开发一个MVC4应用程序,该应用程序旨在为两个域提供服务。我们的大部分内容将在域之间共享,但有时我们需要根据请求来自哪个站点呈现不同的标记(使用Razor) 理想情况下,我需要一种基于约定的方法,允许我拥有如下文件夹结构: Views + Domain1 + ControllerName View1 View2 + Domain2 + ControllerName View1 + ControllerName View1
Views
+ Domain1
+ ControllerName
View1
View2
+ Domain2
+ ControllerName
View1
+ ControllerName
View1
View2
解析视图时,我想先检查特定于域的文件夹,然后检查常规视图文件夹
我的第一个想法是实现一个自定义视图引擎,它继承RazorViewEngine,根据请求域交换ViewLocationFormats字符串。不幸的是,所有这些内容都隐藏在VirtualPathProviderEngine中,无法覆盖。结果是,答案是为每个知道特定于域的文件夹的域创建一个自定义视图引擎(从RazorViewEngine继承):
public class Domain1ViewEngine() : RazorViewEngine
{
...
ViewLocationFormats = new[]
{
"~/Views/Domain1/{1}/{0}.cshtml",
"~/Views/Domain1/Shared/{0}.cshtml"
};
...
}
然后,我需要覆盖FindView
和FindPartialView
方法,以便它仅在请求来自正确的域时尝试查找定位视图:
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
if ([THIS IS NOT THE RIGHT DOMAIN])
{
return new ViewEngineResult(new string[] { });
}
return base.FindView(controllerContext, viewName, masterName, useCache);
}
为了完成这个过程,我以通常的方式在Global.asax.cs
中注册了视图引擎:
protected void Application_Start()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new Domain1ViewEngine());
ViewEngines.Engines.Add(new RazorViewEngine());
}
尽管我正在寻找,但这在一些方面对我有所帮助,并实现了类似的功能,因此您只需要一个自定义视图引擎。如果您没有在特定域下为特定视图使用或拥有文件夹,它将返回默认视图。