2013-02-21 52 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更多的细节分享我的发现。