0

当检测到视图名称时,我正在向视图名称添加移动扩展。

这是当前代码:

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

1 回答 1

0

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

这是一个很好的解决方案,因为它不仅可以工作,而且可以让我轻松升级!

于 2012-04-27T17:55:50.390 回答