移动设备上的MVC4 BrowserOverride.Desktop问题

时间:2012-07-25 08:36:27

标签: .net asp.net-mvc mobile browser-detection

我使用ASPNET.MVC4 RC创建了一个网站。对于每个视图,我创建了2个文件,如index.cshtml和index.Mobile.cshtml,它们代表桌面和移动视图。开箱即用的一切都很好 - 移动设备可以获得移动视图,非移动设备可以获得完整的桌面视图。 但是,我在尝试强制桌面视图到移动设备上时遇到问题(即,当用户点击“完整网站”链接时) - 视图不会更改,移动视图仍会呈现。 我使用以下代码来覆盖浏览器(从全局过滤器调用):

  filterContext.RequestContext.HttpContext.SetOverriddenBrowser(BrowserOverride.Desktop);

我可以看到以下cookie被设置:.ASPXBrowserOverride = [Mozilla%2f4.0 +(兼容%3b + MSIE + 6.1%3b + Windows + XP)]作为此调用的结果,但显然它会被忽略某些原因。 在桌面浏览器上强制移动视图工作正常,即其他方式。 任何帮助将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:2)

此解决方案正常。

控制器:

public class ViewSwitcherController : Controller
{
    //
    // GET: /ViewSwitcher/
    public RedirectResult SwitchView(bool mobile, string returnUrl)
    {
        if (Request.Browser.IsMobileDevice == mobile)
        {
            HttpContext.ClearOverriddenBrowser();
        }
        else
        {
            HttpContext.SetOverriddenBrowser(mobile ? BrowserOverride.Mobile : BrowserOverride.Desktop);
        }
        return Redirect(returnUrl);
    }
}

查看:

<% if (ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice)
   {%>
  <%= Html.ActionLink("Desktop - Version", "SwitchView", "ViewSwitcher", 
      new {  mobile = false, returnUrl = Request.Url.PathAndQuery }, 
      new {  target = "_self" })%>
 <% }
    else
    {%>
  <%= Html.ActionLink("Mobile - Version", "SwitchView", "ViewSwitcher", 
      new { mobile = true, returnUrl = Request.Url.PathAndQuery }, 
      new {  target = "_self" })%>
 <%}%>

答案 1 :(得分:2)

我找到了问题所在。如果有人陷入同一陷阱,这就是它:

当我创建项目时,我为我的设备配置类提取了内容,它将移动DefaultDisplayMode添加到DisplayModeProvider,来自Microsoft support forums上的支持答案。

该代码在Request.UserAgent中寻找特定于移动设备的字符串。但是,SetOverriddenBrowser()方法仅更改被覆盖的用户代理,Request.UserAgent保持不变。

因此,在分析客户的请求时,解决方案是将Request.UserAgent替换为Context.GetOverriddenUserAgent()

答案 2 :(得分:0)

由于您尚未说明您已尝试过的内容或您用于网站设计的内容,请允许我建议您安装jquery mobile(您可以从Nuget获取)并查看它自动安装的视图切换器你可以看看它是如何做到的。这应该是一个很好的起点