検出されたときにビュー名にモバイル拡張機能を追加中です。
現在のコードは次のとおりです。
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);
}