Pregunta Características de ASP.NET MVC 4 Mobile


Estoy probando las nuevas características de ASP.NET MVC 4 Mobile. Hice una aplicación simple con solo un controlador (HomeController) y una vista (índice). También agregué una versión móvil de la vista de índice.

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

Al iniciar la aplicación en un navegador de escritorio, la vista normal se muestra como se esperaba, sin embargo, cuando la inicio en el Opera Mobile Emulator como Samsung Galaxy S, sigo recibiendo la vista normal y no la versión móvil.

la cadena del agente de usuario enviada desde el emulador se ve así:

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

¿Alguna idea sobre por qué esto no está funcionando?

Actualizar Gracias a @nemesv pude resolver el problema, esta es mi solución actual, espero que cubra la mayoría de los escenarios móviles.

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

Y yo Global.asax

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

32
2018-03-08 08:11


origen


Respuestas:


ASP.Net (en realidad el HttpBrowserCapabilitiesBase clase) no reconoce el Opera Mobile Emulator como un navegador móvil.

Puede verificar esto en cualquier acción del controlador: HttpContext.Request.Browser.IsMobileDevice  regresará false para el navegador Opera Mobile.

Porque el construido en DefaultDisplayMode utiliza el siguiente método para verificar navegadores móviles que necesita registrar su costumbre DisplayMode que reconoce correctamente Opera Mobile.

Para hacer esto, debe agregar esto a Global.asax Application_Start:

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

28
2018-03-08 19:29



una solución para todos los móviles sin necesidad de especificar todos los nombres de los navegadores será así ...

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

0
2017-12-16 11:57