ASP.NET MVC 4 Mobile Display Modalità di Smettere di Lavorare

Cellulare modalità di visualizzazione in ASP.NET MVC 4 stop che serve la corretta vista dopo circa un’ora di tempo di attività, nonostante il browser esegue l’override di rilevare correttamente forzato dispositivo mobile.

Riciclaggio il pool di applicazioni temporaneamente risolve il problema.

Il nuovo browser di override correttamente la funzionalità consente ai dispositivi mobili di visualizzare la versione desktop di un sito, e viceversa. Ma dopo circa un’ora di tempo di attività, il punto di vista mobile sono più reso per un dispositivo mobile; solo il desktop di default Rasoio modelli sono resi. L’unica soluzione è quella di riciclare il pool di applicazioni.

Stranamente, il browser ignorare cookie continua a funzionare. Un master _Layout.cshtml modello mostra correttamente il “mobile” o “desktop” testo a seconda del valore di ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice, ma sbagliato di vista sono ancora in fase di rendering. Questo mi porta a credere che il problema si trova con la DisplayModes.

L’azione in questione non è nella cache:

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

Sto usando 51Degrees per il rilevamento di movimento, ma non penso che questo dovrebbe influenzare l’override di rilevamento mobile. Si tratta di un bug in DisplayModes funzione per ASP.NET MVC 4 Beta & Developer Preview, o sto facendo qualcosa di sbagliato?


Qui è il mio DisplayModes installazione in 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
});
  • Ciao hai risolto questo, io sono in esecuzione mvc4 rc e ho lo stesso problema. Lavora inizialmente, ma poi si ferma.
InformationsquelleAutor Petrus Theron | 2012-02-19



7 Replies
  1. 21

    Questo è un problema noto in MVC 4 (Codeplex: #280: Più DisplayModes la Cache di errore, mostra sbagliata). Questo problema verrà risolto nella prossima versione di MVC.

    Nel frattempo, è possibile installare una soluzione pacchetto disponibile qui: http://nuget.org/packages/Microsoft.AspNet.Mvc.FixedDisplayModes.

    Per la maggior parte delle applicazioni, semplicemente l’installazione di questo pacchetto dovrebbe risolvere il problema.

    Per alcune applicazioni che consentono di personalizzare la raccolta di registrato vista dei motori, è necessario assicurarsi che si fa riferimento Microsoft.Web.Mvc.FixedRazorViewEngine o Microsoft.Web.Mvc.FixedWebFormViewEngine, invece della visualizzazione di default implementazioni del motore.

    • OMG, stiamo utilizzando questo pacchetto, ma recentemente distribuito prod con una modifica globale.asax.cs e dimenticai totalmente a livello di programmazione utilizzando FixedRazorViewEngine invece di RazorViewEngine! Non ci posso credere. Quindi sì, davvero grande risposta, soprattutto Per alcune applicazioni che consentono di personalizzare la raccolta di registrato motori di vista” di parte
    • Ci sono alcuni neofiti come me che non capisce cosa fare. Basta sostituire ViewEngines.Engines.Add(new RazorViewEngine()); con ViewEngines.Engines.Add(new Microsoft.Web.Mvc.FixedRazorViewEngine()); Globale.asax
  2. 0

    Non posso parlare per questo particolare stack (io sono ancora in MVC2) ma controlla la cache di output setup (sia nel controller o vista – e nel web.config nella tua app e a livello della macchina). L’ho visto lavorare inizialmente per i primi utenti e quindi un browser desktop arriva proprio nel periodo ASP decide di cache, poi ognuno ha la stessa vista. Abbiamo evitato la cache di output come risultato, sperando che questo possa avere trattato in seguito.

  3. 0

    Se si desidera che tutti i dispositivi mobili di utilizzare lo stesso layout mobile è possibile utilizzare

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

    E, naturalmente, è necessario fare una vista in comune, layout cartella denominata _Layout.Mobile.cshtml

    Se si desidera avere un layout diverso per ogni tipo di dispositivo o browser che hai bisogno di fare questo;

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

    E, naturalmente, è necessario fare una vista in comune, layout cartella per ogni nome

    _Layout.Android.cshtml
    _Layout.iPhone.cshtml
    _Layout.Mobile.cshtml

    • Sì, ne sono consapevole. Ma non è affatto legato alla mia domanda.
  4. 0

    Si può non solo fare questo?

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        //Code removed for clarity.
    
        //Cache never expires. You must restart application pool
        //when you add/delete a view. A non-expiring cache can lead to
        //heavy server memory load.
    
        ViewEngines.Engines.OfType<RazorViewEngine>().First().ViewLocationCache =
            new DefaultViewLocationCache(Cache.NoSlidingExpiration);
    
        //Add or Replace RazorViewEngine with WebFormViewEngine
        //if you are using the Web Forms View Engine.
    }
  5. 0

    Quindi ragazzi, qui è la risposta a tutte le vostre preoccupazioni….. 🙂

    Per evitare il problema, è possibile indicare ASP.NET per variare la voce di cache di secondo se il visitatore utilizza un dispositivo mobile. Aggiungi un VaryByCustom parametri alla tua pagina OutputCache dichiarazione come segue:

    <%@ OutputCache VaryByParam="*" Duration="60" VaryByCustom="isMobileDevice" %>
    Next, define isMobileDevice as a custom cache parameter by adding the following method override to your Global.asax.cs file:
    
    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (string.Equals(custom, "isMobileDevice", StringComparison.OrdinalIgnoreCase))
            return context.Request.Browser.IsMobileDevice.ToString();
    
        return base.GetVaryByCustomString(context, custom);
    }

    Questo farà sì che il mobile visitatori della pagina non ricevere uscita precedentemente messa in cache da un desktop visitatore.

    vedere questo white paper pubblicato da microsoft. 🙂

    http://www.asp.net/whitepapers/add-mobile-pages-to-your-aspnet-web-forms-mvc-application

    Grazie e continuate la codifica…..

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *