1

我有一个 MVC4 应用程序,我使用 51Degrees (Lite) 来检测设备并相应地选择移动 ( .mobile.cshtml) 或桌面 ( .cshtml) 视图。51Degrees 可以很好地完成这项工作。但是,如果我想使用HttpContext.SetOverriddenBrowser(BrowserOverride.Desktop)从移动视图切换到桌面视图(在移动设备上) ,它不起作用。仅供参考,它可以在没有 51Degrees 的情况下工作。

下面是选择显示模式的代码(Global.asax.cs 中的 Application_Start()):

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("mobile")
 {ContextCondition = Context =>Context.Request.Browser["IsMobile"] == "True"
 });

这是视图切换器控制器操作代码:

public class ViewSwitcherController : Controller
{
    public RedirectResult SwitchView(bool mobile, string ReturnUrl="/Login/Login")
    {
        // If the mobile user has requested to view the mobile view
        // remove any overridden user agent for the current request
        if (Request.Browser.IsMobileDevice == mobile)
            HttpContext.ClearOverriddenBrowser();
        else
            // Otherwise override the browser setting to desktop mode
            HttpContext.SetOverriddenBrowser(mobile ? BrowserOverride.Mobile : BrowserOverride.Desktop);

        return Redirect(ReturnUrl);
    }

}

这是视图中切换到桌面视图的代码:

@Html.ActionLink("Desktop view", "SwitchView", "ViewSwitcher", new { mobile = false, ReturnUrl = Request.Url.PathAndQuery }, new { rel = "external" })

如果我遗漏了什么,请告诉我。

提前致谢。

4

2 回答 2

1

对不起,我延迟了很久的回答。

以下解决方案由 51Degrees 的一位开发人员提供:

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("mobile")            
{
ContextCondition = Context => Context.GetOverriddenBrowser()["IsMobile"] == "true"
});

所以用 Context.GetOverriddenBrowser()["IsMobile"] 替换 Context.Request.Browser["IsMobile"] 解决了我的问题。

希望有帮助。

于 2013-07-25T06:52:14.843 回答
0

我知道这有点过时了,但我今晚遇到了这个。相同的症状。没有 Mobi51 的作品,没有。我的工作理论是,Mobi51 触及 Request.Browser.IsMobileDevice,它控制该属性并设置其值,而不管您期望 .NET 对它做什么。

我目前的解决方案是这样的。当我签入 viewstart 文件以切换布局时,我会检查Request.Browser.IsMobileDevice 和Context.GetOverridenBrowser ( ).IsMobileDevice是否为真。

当它是真正的移动时,两者都将是真的。当它是真正的桌面时,两者都是错误的。当它是请求桌面的移动视图时,Request.Browser.IsMobileDevice 将为真(因为 Mobi51 这么说)并且 Context.GetOverridenBrowser().IsMobileDevice 将为假。这是我的观点

@{
Layout = Request.Browser.IsMobileDevice && Context.GetOverriddenBrowser().IsMobileDevice
      ? "~/Views/Shared/_LayoutMobile.cshtml"
      : "~/Views/Shared/_Layout.cshtml";        
}

我仍在审查这一点,并且仍然必须将桌面添加到移动切换(我已经看到了一个问题,但是使该方向也起作用的改变很容易,但是在我今晚的五分钟测试中,这已经工作。我很好奇你是否找到了另一个理由/方法来解决这个问题,或者这个解决方案是否让你满意。

于 2013-06-24T06:45:50.700 回答