【问题标题】:Master page magically changes in ASP.NET MVC Custom View EngineASP.NET MVC 自定义视图引擎中的母版页神奇地变化
【发布时间】:2014-01-08 18:43:13
【问题描述】:

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

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

问题是,即使它使用masterNameX(而不是X.Mobile)的else 语句,当使用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
            );
    }
  }
}

【问题讨论】:

  • 我会在您的代码库中搜索IsMobileDevice 的其他用途。
  • 很遗憾,这并没有导致任何可能影响此问题的事情

标签: asp.net-mvc master-pages viewengine


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2015-02-12
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多