【问题标题】:MVC4 Razor Custom View LocatorMVC4 Razor 自定义视图定位器
【发布时间】:2012-12-12 15:09:16
【问题描述】:

我正在开发一个旨在为两个域提供服务的 MVC4 应用程序。我们的大部分内容将跨域共享,但有时我们需要根据请求来自哪个站点来呈现不同的标记(使用 Razor)。

理想情况下,我想要一种基于约定的方法,允许我拥有这样的文件夹结构:

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

解析视图时,我想先检查特定于域的文件夹,然后检查常规视图文件夹。

我的第一个想法是实现一个继承 RazorViewEngine 的自定义视图引擎,该引擎将根据请求域交换 ViewLocationFormats 字符串。不幸的是,所有这些东西都隐藏在 VirtualPathProviderEngine 中,无法被覆盖。

【问题讨论】:

    标签: razor asp.net-mvc-4


    【解决方案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());
    }
    

    【讨论】:

    • 尽管我一直在寻找,但它在一些方面帮助了我,并实现了类似于 this 的东西,因此您只需要一个自定义视图引擎。如果您不使用或没有用于特定域下的特定视图的文件夹,它将回退到默认视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多