28 votes

Les modes d'affichage mobiles ASP.NET MVC 4 cessent de fonctionner

Mobile modes d'affichage dans l'ASP.NET MVC 4 arrêtez de servir la bonne vue après environ une heure de temps de fonctionnement, en dépit de navigateur remplace correctement détecter un substituée appareil mobile.

Le recyclage de l'application de la piscine résout temporairement le problème.

Le nouveau navigateur fonctionnalité de remplacement correctement permet aux périphériques mobiles pour afficher la version complète d'un site, et vice-versa. Mais après environ une heure de temps de fonctionnement, les affichages mobiles ne sont plus rendus pour un appareil mobile; seul le bureau par défaut de Rasoir modèles sont rendus. La seule solution est de recycler le pool d'applications.

Étrangement, le navigateur remplacer cookie continue à fonctionner. Un maître - _Layout.cshtml modèle de montre correctement "mobile" ou "bureau" du texte en fonction de la valeur de ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice, mais le mal vues sont toujours en cours de rendu. Cela m'amène à croire que le problème se trouve avec le DisplayModes.

L'action en question n'est pas mis en cache:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]

Je suis à l'aide de 51Degrees pour mobile de détection, mais je ne pense pas que cela devrait se répercuter sur le substituée mobile de détection. Est-ce un bug DisplayModes fonctionnalité pour ASP.NET MVC 4 Beta & Developer Preview, ou suis-je en train de faire quelque chose de mal?


Voici mon DisplayModes d'installation en Application_Start:

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone")
{
    ContextCondition = context =>
        context.GetOverriddenBrowser().IsMobileDevice
        && (context.Request.UserAgent.IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0
        || context.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0
        || !context.Request.Browser.IsMobileDevice)
    });

/*  Looks complicated, but renders Home.iPhone.cshtml if the overriding browser is
    mobile or if the "real" browser is on an iPhone or Android. This falls through
    to the next instance Home.Mobile.cshtml for more basic phones like BlackBerry.
*/

DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Mobile")
{
    ContextCondition = context =>
        context.GetOverriddenBrowser().IsMobileDevice
});

21voto

marcind Points 38002

C'est un problème connu dans MVC 4 (Codeplex: #280: Plusieurs DisplayModes de mise en Cache d'erreur, fera preuve de la mauvaise opinion). Cela sera corrigé dans la prochaine version de la MVC.

En attendant, vous pouvez installer une solution de contournement package disponible ici: http://nuget.org/packages/Microsoft.AspNet.Mvc.FixedDisplayModes.

Pour la plupart des applications simplement l'installation de ce paquet devrait résoudre le problème.

Pour certaines applications qui permettent de personnaliser la collecte des inscrits moteurs de visualisation, vous devriez assurez-vous de référence Microsoft.Web.Mvc.FixedRazorViewEngine ou Microsoft.Web.Mvc.FixedWebFormViewEngine, au lieu de la vue par défaut du moteur de mise en œuvre.

1voto

user1501346 Points 11

J'ai eu un problème similaire et il s'est avéré être un bogue lors du mélange de vues de bureau basées sur des formulaires Web avec des vues mobiles basées sur un rasoir.

Voir http://aspnetwebstack.codeplex.com/workitem/276 pour plus d'informations

1voto

user1436475 Points 11

Peut-être un bogue dans ASP.NET MVC 4 lié à la mise en cache des vues, voir:

http://forums.asp.net/p/1824033/5066368.aspx/1?Re+MVC+4+RC+Mobile+View+Cache+bug+

0voto

hoserdude Points 629

Je ne peux pas parler pour cette pile particulière (je suis toujours dans MVC2) mais vérifiez votre configuration de mise en cache de sortie (soit dans vos contrôleurs ou vues - et dans votre web.config dans votre application et au niveau de la machine). Je l'ai vu fonctionner initialement pour les premiers utilisateurs, puis un navigateur de bureau arrive juste au moment où ASP décide de mettre en cache, puis tout le monde obtient la même vue. En conséquence, nous avons évité la mise en cache de sortie, en espérant que cela serait résolu plus tard.

0voto

KenL Points 360

Si vous souhaitez que tous les appareils mobiles d'utiliser le même mobile mise en page que vous pouvez utiliser

DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Mobile") 
{ 
    ContextCondition = context => 
        context.GetOverriddenBrowser().IsMobileDevice 
}); 

Et bien sûr, vous avez besoin de faire un affichage dans la mise en page dossier nommé _Layout.Mobile.cshtml

Si vous voulez avoir une mise en page distincte pour chaque type de dispositif ou d'un navigateur, vous avez besoin pour ce faire;

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

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

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

Et bien sûr, vous avez besoin de faire un affichage dans la mise en page du dossier de chaque nommée

_Layout.Android.cshtml _Layout.de l'iPhone.cshtml _Layout.Mobile.cshtml

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