1

OK私はこのコードをカスタムビューエンジンで継承しました。FindViewデバイスに基づいて異なるビューを返すためにオーバーライドするだけです。現在、iPadはモバイルデバイスとして検出されているため、モバイルビューが表示されます。私の仕事はこれをデスクトップビューに変更することです。

2つのマスターページX.masterとがありX.Mobile.masterます。.Mobileコードから、モバイルデバイスのマスターページ名に手動で追加されていることがわかります。私がやったのはiPad用に設定isMobileすることだけです。false

問題は、 (ではなく) masterNamebeingを使用してelseステートメントに移動しても、iPadで表示すると、返されるビューがマスターページとして使用されることです。したがって、iPadの場合、モバイルマスターページを含むデスクトップビューが表示されることになります。デスクトップ版とモバイル版はすべて問題ありません。これはどこで(そしてどのように)起こり得るのでしょうか?XX.MobileX.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
            );
    }
  }
}
4

1 に答える 1

1

controllerContext.HttpContext.Request.Browser.IsMobileDevice == trueOK、ASP.NET MVC (オープン ソースに感謝) を見た後、リクエストがモバイル ( cshtml. マスターページも同様です。

私の場合、確かに masterpage.mobile があったため、レンダリングされていました。ビューに関しては、モバイル版が別フォルダにあったため拾われず、通常のviewname.cshtmlにフォールバックしていました。

この調査全体には少し時間がかかりましたが、それが私のブログで私の調査結果をより詳細に共有する動機になりました.

于 2013-07-25T13:53:18.383 に答える