2012-07-25 20 views
2

我使用ASPNET.MVC4 RC創建了一個網站。對於每個視圖,我創建了兩個文件,如index.cshtml和index.Mobile.cshtml,代表桌面和移動視圖。開箱即用一切工作正常 - 移動設備獲得移動視圖,非移動設備獲得完整的桌面視圖。 但是,我試圖強制桌面視圖到移動設備上(即當用戶點擊「完整網站」鏈接時) - 視圖不會改變,移動視圖仍然呈現。 我用下面的代碼重寫瀏覽器(從全局濾波器稱爲):MVC4 BrowserOverride.Desktop問題在手機上

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

我可以看到以下的cookie獲取設置:.ASPXBrowserOverride = [Mozilla的%2f4.0 +(兼容%3B + MSIE + 6.1% 3b + Windows + XP)]作爲此調用的結果,但顯然由於某種原因它會被忽略。 在桌面瀏覽器上強制移動視圖可以正常工作,即以其他方式工作。 任何幫助將不勝感激。

謝謝。

回答

2

我發現在我的問題是。如果有人陷入同樣的​​陷阱,這是它是什麼:

當我創建我的項目時,我拿我的設備配置類的內容,它添加到DisplayModeProvider手機DefaultDisplayMode,從支持答案我發現Microsoft support forums

該代碼正在尋找Request.UserAgent中移動設備特定的字符串。但是,SetOverriddenBrowser()方法僅更改重寫的用戶代理,因此Request.UserAgent保持不變。

因此解決方案是在分析客戶端的請求時用Context.GetOverriddenUserAgent()代替Request.UserAgent

0

由於您尚未說明您已經嘗試了什麼或者您正在使用什麼設計您的網站,請允許我建議您安裝jquery mobile(您可以從Nuget獲取它)並自動查看視圖切換器安裝給你看看它是如何做到的。這應該是一個很好的起點

+0

謝謝,MVC 4開箱即用jquerymobile,但我的問題與jquery或客戶端無關。 MVC 4本身提供移動設備檢測和視圖切換。問題在於MVC4瀏覽器覆蓋代碼。 – Andre 2012-07-25 20:03:34

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" })%> 
<%}%>