2012-03-08 102 views
32

我正在嘗試新的ASP.NET MVC 4移動功能。我用一個控制器(HomeController)和一個視圖(Index)做了一個簡單的應用程序。我還添加了索引視圖的移動版本。ASP.NET MVC 4移動功能

Views/Home/Index.cshtml 
Views/Home/Index.Mobile.cshtml 

當啓動在桌面瀏覽器應用程序的常規示意圖如圖預期,但是當我啓動在Opera Mobile Emulator作爲三星Galaxy S的應用,我仍然得到常規視圖,而不是移動版本。

從仿真器發送的用戶代理字符串看起來是這樣的:

Opera/9.80 (Windows NT 6.1; Opera Mobi/23731; U; en) Presto/2.9.201 Version/11.50 

爲什麼這是行不通的任何想法?

更新 感謝@nemesv我能解決這個問題,這裏是我目前的解決方案,希望它能覆蓋大多數移動場景。

public class MobileDisplayMode : DefaultDisplayMode 
{ 
    private readonly StringCollection _useragenStringPartialIdentifiers = new StringCollection 
    { 
     "Android", 
     "Mobile", 
     "Opera Mobi", 
     "Samsung", 
     "HTC", 
     "Nokia", 
     "Ericsson", 
     "SonyEricsson", 
     "iPhone" 
    }; 

    public MobileDisplayMode() : base("Mobile") 
    { 
     ContextCondition = (context => IsMobile(context.GetOverriddenUserAgent())); 
    } 

    private bool IsMobile(string useragentString) 
    { 
     return _useragenStringPartialIdentifiers.Cast<string>() 
        .Any(val => useragentString.IndexOf(val, StringComparison.InvariantCultureIgnoreCase) >= 0); 
    } 
} 

而且我的Global.asax

DisplayModeProvider.Instance.Modes.Insert(0, new MobileDisplayMode()); 
+2

拯救生命。它真的很愚蠢,教程不會說這個。它只是從微軟方面感覺如此半屁股。他們通常與他們的教程保持一致。 – 2012-09-20 14:29:40

+1

謝謝,雖然StringCollection似乎是有史以來最無用的類之一。它不僅沒有提供這個代碼示例中的任何內容,也不提供性能,因此您不得不編寫額外的代碼(Cast ),以便使用它。用替換它,然後快樂地生活 – PandaWood 2014-09-30 07:03:51

回答

28

ASP.Net(實際上是HttpBrowserCapabilitiesBase類)不能識別的Opera Mobile模擬器的手機瀏覽器。

您可以在任何控制器操作中檢查此操作:HttpContext.Request.Browser.IsMobileDevice將返回Opera移動瀏覽器的false

由於內置的​​DefaultDisplayMode使用以下方法來檢查移動瀏覽器,您需要註冊您正確識別Opera Mobile的自定義DisplayMode

要做到這一點,你需要它添加到Global.asax中Application_Start

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("Mobile") 
{ 
    ContextCondition = (context => context.GetOverriddenUserAgent() 
     .IndexOf("Opera Mobi", StringComparison.OrdinalIgnoreCase) >= 0) 
}); 
+1

謝謝!這很好用!事實證明,它沒有識別出三星Galaxy S上的默認瀏覽器。我一直無法找到MVC 4框架如何驗證用戶代理字符串。我實現了一個希望能覆蓋大多數場景的類。我已經用該代碼更新了問題。 – Pelle 2012-03-09 21:35:30

+5

您應該查看免費的基於Keynote Mite桌面的工具來測試和驗證移動Web內容應用程序。這是一款出色的移動測試工具。 http://mite.keynote.com/ – 2012-03-12 13:06:44

+0

感謝您的提示,我會做到這一點 – Pelle 2012-03-14 20:57:02

0

而無需指定所有瀏覽器的名稱會是這樣對所有手機的解決方案......

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 

     DisplayModeProvider.Instance.Modes.Insert(0, 
      new DefaultDisplayMode("Mobile") 
      { 
       ContextCondition = (ctx => (
        (ctx.GetOverriddenUserAgent() != null) && ctx.Request.Browser.IsMobileDevice 
      )) 
      }); 
    }  
+1

實際上這不會工作,根據http://stackoverflow.com/questions/12710026/how-does-mvc4-detect-a-mobile-browser使得Request.Browser.IsMobileDevice檢測移動設備的相同代碼是與選擇移動視圖進行渲染時所執行的檢查相同。 – JonVD 2014-01-09 06:13:53