如何实现“级联”ViewEngineResults?

时间:2012-04-27 17:07:42

标签: asp.net-mvc-3 viewengine

我正在检测视频名称时为其添加移动扩展程序。

以下是当前代码:

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
        string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"];

        return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache);
}

因此,如果路线转到SomeController并且应用设置显示该组是“TeamA”(例如),那么将呈现的视图将为Index_TeamA.cshtml

但是如果没有Index_TeamA.cshtml,那么它会默认为Index.cshtml。

(这是因为某些团队要求的一些观点有很小的变化。)

但是现在我想为移动版本添加另一个级别:

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
        string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"];

        if (HttpContext.Current.Request.Browser.IsMobileDevice)
             GroupName += "_MOB";

        return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache);
}

然而,问题是,如果找不到Index_TeamA_MOB.cshtml,则默认为Index.cshtml,当我实际希望它默认为Index_TeamA.cshtml时。

很清楚为什么会发生这种情况,问题是我如何级联这个实现呢?因此,它首先检查组版本的移动版本(如果检测到移动浏览器),那么如果不存在回退到组版本,那么如果没有那么获得默认视图?

更新,此处为版本1

编辑:好的,显然会导致无限循环。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"];

            if (HttpContext.Current.Request.Browser.IsMobileDevice)
            {
                var result = ViewEngines.Engines.FindView(controllerContext, viewName + "_" + GroupName + "_MOB", masterName);

                if (result != null)
                    return base.FindView(controllerContext, viewName + "_" + GroupName + "_MOB", masterName, useCache);
            }

            return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache);
        }

1 个答案:

答案 0 :(得分:0)

啊哈哈!似乎最好的答案是实现为MVC 3提供的新MVC 4方法。看看我发现的这篇博文:http://dotnet.learningtree.com/2011/10/31/preparing-for-asp-net-mvc-4-mobile-development/

这是一个很好的解决方案,因为它不仅可以工作,而且可以让我以更少的麻烦进行升级!