我工作的,旨在服务两个领域的应用MVC4。 我们的大部分内容将在整个域共享,但有时我们需要处理不同的标记(用剃刀),这取决于网站的要求是从哪里来的。
理想情况下,我想基于惯例的方法,让我有一个文件夹结构是这样的:
Views
+ Domain1
+ ControllerName
View1
View2
+ Domain2
+ ControllerName
View1
+ ControllerName
View1
View2
在解决一个观点,我想首先检查特定于域的文件夹,那么一般views文件夹。
我的第一个想法就是要实现继承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());
}