2012-03-08 17 views
32

私は新しいASP.NET MVC 4モバイル機能を試しています。私はただ1つのコントローラ(HomeController)と1つのビュー(インデックス)で簡単なアプリケーションを作った。インデックスビューのモバイル版を追加しました。私はサムスンギャラクシーSとしてOpera Mobile Emulatorでアプリケーションを起動すると、デスクトップブラウザでアプリケーションを起動すると予想されるように定期的なビューが表示されASP.NET MVC 4モバイル機能

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

は、しかし、私はまだ通常のビューではなく、モバイルバージョンを取得します。

エミュレータから送られたユーザーエージェント文字列は次のようになります。これが機能しない理由に

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

命の恩人。チュートリアルでこれを言っていないというのは実際には愚かです。それはちょうどマイクロソフト側から半分のお尻を感じる。彼らは通常、彼らのチュートリアルをポイントしています。 –

+1

おかげさまで、StringCollectionはこれまでにない無駄なクラスのようです。このコードサンプルでは何も提供していないだけでなく、パフォーマンスを向上させるだけでなく、使用するために余分なコード(キャスト)を記述する必要があります。それをリストに置き換えて、幸せに暮らしてから – PandaWood

答えて

28

ASP.Net(実際HttpBrowserCapabilitiesBaseクラス)は、モバイルブラウザとしてOperaのモバイルエミュレータを認識しません。

コントローラの操作でこれを確認できます。HttpContext.Request.Browser.IsMobileDeviceは、Opera Mobileブラウザ用にfalseを返します。

組み込みのDefaultDisplayModeは、モバイルブラウザを確認するために次の方法を使用しているため、Operaモバイルを正しく認識するカスタムDisplayModeを登録する必要があります。

あなたはGlobal.asaxの Application_Startにこれを追加する必要があり、これを行うには:

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

ありがとう!それは素晴らしい仕事でした!それは判明したように、それはサムスンギャラクシーSのデフォルトブラウザを認識しませんでした。私は、MVC 4フレームワークがユーザエージェント文字列をどのように検証するかを正確に知ることができませんでした。ほとんどのシナリオをカバーするクラスを実装しました。私はそのコードで質問を更新しました。 – Pelle

+5

モバイルWebコンテンツアプリケーションのテストと検証のために、無料のKeynote Miteデスクトップベースツールをチェックしてください。優れたモバイルテストツールです。 http://mite.keynote.com/ –

+0

ヒントありがとうございます – Pelle

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