我正在考虑实现自定义RazorViewEngine。基本上,我有两个站点实际上具有相同的代码库。不同之处在于它们看起来不同。我想覆盖标准视图引擎,以使MVC在其视图,布局等两个单独的位置中查看。一个用于公司A,另一个用于公司B。公司A将包含主视图,公司B的视图将覆盖这些主视图。因此,我希望View Engine在位置B中查找视图,布局,主视图或局部视图,如果找到它,则将其返回,如果找不到,则希望它默认为公司A的视图作为默认视图。显然,公司A仅会在其自己的文件夹中查找。
RazorViewEngine
好的问题的关键:我找到了这个网站:http : //www.aspnetwiki.com/mvc-3-razor :extending-the-view- engine
第一个问题,这是实现这一目标的最佳方法吗?
其次我需要重写CreatePartial,CreateView,FindPartial和FindView方法呢?
CreatePartial
CreateView
FindPartial
FindView
更新资料
好的,我自己想出了第二个问题,我想覆盖的方法是CreateView,CreatePartialView此时,它已经构建了视图字符串,我可以摆弄它。
CreatePartialView
好的,最后我选择了一种详细的方法:http : //weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic- view- location.aspx
感谢@Adriano的回答和建议,但最终我认为这种方法更适合我的需求。下面的方法使我可以保留标准功能,但可以创建要搜索的更高优先级的新位置。
public class Travel2ViewEngine : RazorViewEngine { protected BrandNameEnum BrandName; private string[] _newAreaViewLocations = new string[] { "~/Areas/{2}/%1Views/{1}/{0}.cshtml", "~/Areas/{2}/%1Views/{1}/{0}.vbhtml", "~/Areas/{2}/%1Views//Shared/{0}.cshtml", "~/Areas/{2}/%1Views//Shared/{0}.vbhtml" }; private string[] _newAreaMasterLocations = new string[] { "~/Areas/{2}/%1Views/{1}/{0}.cshtml", "~/Areas/{2}/%1Views/{1}/{0}.vbhtml", "~/Areas/{2}/%1Views/Shared/{0}.cshtml", "~/Areas/{2}/%1Views/Shared/{0}.vbhtml" }; private string[] _newAreaPartialViewLocations = new string[] { "~/Areas/{2}/%1Views/{1}/{0}.cshtml", "~/Areas/{2}/%1Views/{1}/{0}.vbhtml", "~/Areas/{2}/%1Views/Shared/{0}.cshtml", "~/Areas/{2}/%1Views/Shared/{0}.vbhtml" }; private string[] _newViewLocations = new string[] { "~/%1Views/{1}/{0}.cshtml", "~/%1Views/{1}/{0}.vbhtml", "~/%1Views/Shared/{0}.cshtml", "~/%1Views/Shared/{0}.vbhtml" }; private string[] _newMasterLocations = new string[] { "~/%1Views/{1}/{0}.cshtml", "~/%1Views/{1}/{0}.vbhtml", "~/%1Views/Shared/{0}.cshtml", "~/%1Views/Shared/{0}.vbhtml" }; private string[] _newPartialViewLocations = new string[] { "~/%1Views/{1}/{0}.cshtml", "~/%1Views/{1}/{0}.vbhtml", "~/%1Views/Shared/{0}.cshtml", "~/%1Views/Shared/{0}.vbhtml" }; public Travel2ViewEngine() : base() { Enum.TryParse<BrandNameEnum>(Travel2.WebUI.Properties.Settings.Default.BrandName, out BrandName); AreaViewLocationFormats = AppendLocationFormats(_newAreaViewLocations, AreaViewLocationFormats); AreaMasterLocationFormats = AppendLocationFormats(_newAreaMasterLocations, AreaMasterLocationFormats); AreaPartialViewLocationFormats = AppendLocationFormats(_newAreaPartialViewLocations, AreaPartialViewLocationFormats); ViewLocationFormats = AppendLocationFormats(_newViewLocations, ViewLocationFormats); MasterLocationFormats = AppendLocationFormats(_newMasterLocations, MasterLocationFormats); PartialViewLocationFormats = AppendLocationFormats(_newPartialViewLocations, PartialViewLocationFormats); } private string[] AppendLocationFormats(string[] newLocations, string[] defaultLocations) { List<string> viewLocations = new List<string>(); viewLocations.AddRange(newLocations); viewLocations.AddRange(defaultLocations); return viewLocations.ToArray(); } protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) { return base.CreateView(controllerContext, viewPath.Replace("%1", BrandName.ToString()), masterPath); } protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) { return base.CreatePartialView(controllerContext, partialPath.Replace("%1", BrandName.ToString())); } protected override bool FileExists(ControllerContext controllerContext, string virtualPath) { return base.FileExists(controllerContext, virtualPath.Replace("%1", BrandName.ToString())); } }
然后在Gloabal.asax中注册
protected void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); //Register our customer view engine to control T2 and TBag views and over ridding ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new Travel2ViewEngine()); }