1

好的,我已经使用自定义视图引擎继承了此代码。它所做的只是覆盖FindView,以便根据设备返回不同的视图。目前,iPad 被检测为移动设备,因此会显示移动视图。我的任务是将其更改为桌面视图。

有两个母版页X.masterX.Mobile.master. 从代码中,您可以看到它手动添加.Mobile到移动设备的母版页名称。我所做的只是isMobilefalseiPad 设置。

问题是,即使它使用 is(而不是 )进入 else 语句masterNameXX.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
            );
    }
  }
}
4

1 回答 1

1

好的,所以在查看 ASP.NET MVC(感谢上帝的开源)之后,我可以看到当请求被标记为移动(controllerContext.HttpContext.Request.Browser.IsMobileDevice == true)时,MVC 在尝试视图名称之前默认尝试 viewname.mobile.cshtml(或 .aspx)。 .cshtml。母版页也是如此。

在我的例子中,因为确实有一个 masterpage.mobile,所以它正在被渲染。至于视图,因为移动版本在一个单独的文件夹中,所以它没有被拾取,它正在回退到正常的 viewname.cshtml。

整个调查花了我一点时间,这促使我在我的博客中更详细地分享我的发现。

于 2013-07-25T13:53:18.383 回答