2012-03-07 12 views
12

Sto lavorando all'aggiornamento di un'applicazione da MVC3 a MVC4 e ho notato qualcosa che ho presunto (sperato?) Avrebbe "funzionato".ASP.Net MVC4 Mobile-Aware OutputCache

CODICE:

[OutputCache(Duration = 600, VaryByParam = "none")] 
public ActionResult Index() 
{ 
    return View(); 
} 

Si tratta di un libro di testo ad esempio la memorizzazione nella cache per ASP.Net. Ogni volta che un browser raggiunge la pagina, controlla la cache per vedere se esiste qualcosa, genera la vista se non è presente e quindi invia i risultati nella cache.

Questo funziona benissimo; tuttavia, giocando con la funzionalità di visualizzazione mobile di MVC4, ho notato che il codice sopra non controlla se la richiesta proviene da un dispositivo mobile. Quindi, se premo quel percorso su un desktop, la vista desktop verrà visualizzata sul mio telefono fino a quando la cache non sarà invalidata. È vero anche il contrario (se prima colpisco la pagina con un telefono, il desktop vedrà invece la vista mobile).

C'è un parametro che potrei usare per fare questo lavoro come speravo o sto cercando di costruire un cliente OutputCacheProvider?

risposta

25

Dopo aver scavato un po 'di più, ho trovato una soluzione al problema.

azione di controllo Aggiornamento

[OutputCache(Duration = 600, VaryByCustom = "IsMobile")] 
public ActionResult Index() 
{ 
    return View(); 
} 

Override GetVaryByCustomString in Global.asax

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom.ToLowerInvariant() == "ismobile" && context.Request.Browser.IsMobileDevice) 
    { 
     return "mobile"; 
    } 
    return base.GetVaryByCustomString(context, custom); 
} 
+0

Molto interessante, sto avendo un SI problema miliare, grazie! – Pelle

+1

Passare alla visualizzazione desktop non funziona con questo codice. La pagina si aggiorna semplicemente anziché passare. Utilizzare invece context.GetVaryByCustomStringForOverriddenBrowser(). –

5

Questo è il metodo corretto GetVaryByCustomString

public override string GetVaryByCustomString(HttpContext context, string custom) 
    { 
     if (custom.ToLowerInvariant() == "ismobile") 
     { 
      return context.GetVaryByCustomStringForOverriddenBrowser(); 
     } 
     return base.GetVaryByCustomString(context, custom); 
    }