OK私はこのコードをカスタムビューエンジンで継承しました。FindView
デバイスに基づいて異なるビューを返すためにオーバーライドするだけです。現在、iPadはモバイルデバイスとして検出されているため、モバイルビューが表示されます。私の仕事はこれをデスクトップビューに変更することです。
2つのマスターページX.master
とがありX.Mobile.master
ます。.Mobile
コードから、モバイルデバイスのマスターページ名に手動で追加されていることがわかります。私がやったのはiPad用に設定isMobile
することだけです。false
問題は、 (ではなく) masterName
beingを使用してelseステートメントに移動しても、iPadで表示すると、返されるビューがマスターページとして使用されることです。したがって、iPadの場合、モバイルマスターページを含むデスクトップビューが表示されることになります。デスクトップ版とモバイル版はすべて問題ありません。これはどこで(そしてどのように)起こり得るのでしょうか?X
X.Mobile
X.Mobile.Master
サンプルアクションメソッド:
public ActionResult Index()
{
return View("Index", "X");
}
次に、viewengineの簡略化されたバージョンを示します。
class MobileViewEngine : FixedWebFormViewEngine
{
public override ViewEngineResult FindView(
ControllerContext controllerContext,
string viewName,
string masterName,
bool useCache
)
{
ViewEngineResult result;
bool isMobile =
controllerContext.HttpContext.Request.Browser.IsMobileDevice;
if (isiPad(controllerContext.HttpContext.Request))
{
isMobile = false;
}
if (isMobile)
{
masterName = masterName + ".Mobile";
string viewPathAndName = "M/" + viewName;
//Mobile view retrieved from cache
result = base.FindView(
controllerContext,
viewPathAndName,
masterName,
true
);
if (result == null || result.View == null)
{
//Mobile view retrieved, no cache
result = base.FindView(
controllerContext,
viewPathAndName,
masterName,
false
);
}
}
else
{
//desktop view retrieved
result = base.FindView(
controllerContext,
viewName,
masterName,
false
);
}
}
}