当检测到视图名称时,我正在向视图名称添加移动扩展。
这是当前代码:
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);
}