2

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

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

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

谢谢。

4

3 回答 3

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" })%>
 <%}%>
于 2012-08-21T16:47:14.707 回答
2

我找到了我的问题所在。万一有人落入同一个陷阱,它是这样的:

当我创建我的项目时,我从我在Microsoft 支持论坛上找到的支持答案中获取了我的设备配置类的内容,该类将移动 DefaultDisplayMode 添加到 DisplayModeProvider 。

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

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

于 2012-09-06T03:57:43.983 回答
0

由于您还没有说明您已经尝试过什么或您正在使用什么来设计您的网站,请允许我建议您安装 jquery mobile(您可以从 Nuget 获得)并查看它自动为您安装的视图切换器看看它是怎么做的。这应该是一个很好的起点

于 2012-07-25T08:54:56.843 回答