2013-02-21 53 views
2

好的我已經繼承了這個代碼與自定義視圖引擎。它所做的是覆蓋FindView,以便返回基於設備的不同視圖。目前,iPad被檢測爲移動設備,因此顯示移動視圖。我的任務是將其更改爲桌面視圖。母版頁在ASP.NET MVC自定義視圖引擎奇蹟般地變化

有兩個主頁面X.masterX.Mobile.master。從代碼中,您可以看到它手動將.Mobile添加到移動設備的主頁面名稱。我所做的只是將isMobile設置爲false

的問題是,即使它去else語句與masterNameX(而不是X.Mobile),使用iPad查看時,被返回的觀點有X.Mobile.Master它的母版頁。因此,對於iPad,它最終會顯示帶有移動主頁的桌面視圖。桌面和移動版本都很好。哪裏(以及如何)這可能發生?

樣本的操作方法:

public ActionResult Index() 
{ 
    return View("Index", "X"); 
} 

這裏的視圖引擎的簡化版本:

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 
      ); 
    } 
    } 
} 
+0

我會搜索你的代碼庫以用於IsMobileDevice的其他用途。 – 2013-02-21 07:29:36

+0

不幸的是,這並沒有導致任何可能影響這個問題的事情 – Hossein 2013-02-21 23:46:47

回答

2

可以這麼看着ASP.NET MVC(感謝上帝開源)後,我可以看到當請求被標記爲移動時(controllerContext.HttpContext.Request.Browser.IsMobileDevice == true),MVC在嘗試viewname.cshtml之前默認嘗試viewname.mobile.cshtml(或.aspx)。 masterpage也一樣。

在我的情況,因爲確實有一個masterpage.mobile,它正在渲染。至於視圖,因爲手機版本是在一個單獨的文件夾中,它沒有被拾起,它正在回落到正常的viewname.cshtml。

這整個調查花了我一點,這促使我在my blog更多的細節分享我的發現。