32 votes

ASP.NET MVC 4 Mobile Caractéristiques

Je suis d'essayer la nouvelle ASP.NET MVC 4 Fonctionnalités Mobiles. J'ai fait une application simple avec un seul contrôleur HomeController) et d'un point de vue (Index). J'ai également ajouté une version mobile de la vue index.

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

Lors du lancement de l'application dans un navigateur de bureau, l'affichage normal est indiqué comme prévu, cependant lorsque je lance l'application dans les Opera Mobile Emulator qu'un Samsung Galaxy S, j'ai toujours l'affichage normal et pas la version mobile.

la chaîne de l'agent utilisateur envoyés à partir de l'émulateur ressemble à ceci:

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

Toutes les idées sur pourquoi cela ne fonctionne pas?

Mise à jour Grâce à @nemesv j'ai été en mesure de résoudre le problème, ici, c'est ma solution actuelle, nous espérons qu'il couvre la plus grande partie mobile scénarios.

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);
    }
}

Et j'ai Mondiale.asax

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

29voto

nemesv Points 71516

ASP.Net (en fait, l' HttpBrowserCapabilitiesBase de la classe) ne reconnaît pas le Opera Mobile Emulator comme un navigateur Mobile.

Vous pouvez vérifier cela dans n'importe quel contrôleur de l'action: HttpContext.Request.Browser.IsMobileDevice sera de retour false pour le navigateur Mobile Opera.

Parce que le construit en DefaultDisplayMode utilise la méthode suivante pour vérifier les navigateurs mobiles, vous devez enregistrer votre propre DisplayMode qui reconnaît correctement Opera Mobile.

Pour ce faire, vous devez ajouter au Mondial.asax Application_Start:

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

0voto

ahaliav fox Points 737

une solution pour tous les mobiles sans avoir besoin de spécifier tous les noms de navigateurs sera comme ça ...

   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
             ))
             });  
    }     
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X