MVC4剃刀自定义视图定位器(MVC4 Razor Custom View Locator)

2019-07-05 01:47发布

我工作的,旨在服务两个领域的应用MVC4。 我们的大部分内容将在整个域共享,但有时我们需要处理不同的标记(用剃刀),这取决于网站的要求是从哪里来的。

理想情况下,我想基于惯例的方法,让我有一个文件夹结构是这样的:

Views
+ Domain1
    + ControllerName
        View1
        View2
+ Domain2
    + ControllerName
        View1
+ ControllerName
   View1
   View2

在解决一个观点,我想首先检查特定于域的文件夹,那么一般views文件夹。

我的第一个想法就是要实现继承RazorViewEngine会掉根据请求域ViewLocationFormats串自定义视图引擎。 不幸的是所有这些东西埋在VirtualPathProviderEngine并且不能被重写。

Answer 1:

事实证明,答案是创建一个自定义视图引擎(从RazorViewEngine继承),而知道该域特定文件夹的每个域:

public class Domain1ViewEngine() : RazorViewEngine
{
        ...

        ViewLocationFormats = new[]
        {
            "~/Views/Domain1/{1}/{0}.cshtml",
            "~/Views/Domain1/Shared/{0}.cshtml"
        };

        ...
}

然后,我要重写FindViewFindPartialView方法,使其只能试图找到定位的看法,如果请求都来自权域:

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());
}


文章来源: MVC4 Razor Custom View Locator