2012-03-07 15 views
12

Estoy trabajando en la actualización de una aplicación de MVC3 a MVC4 y noté algo que asumí (¿esperaba?) "Simplemente funcionaría".ASP.Net MVC4 Mobile-Aware OutputCache

CÓDIGO:

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

Se trata de un libro de texto de ejemplo para el almacenamiento en caché de ASP.Net. Cada vez que un navegador llega a la página, comprueba el caché para ver si existe algo, genera la vista si no es así y luego envía los resultados almacenados en caché.

Esto funciona genial; sin embargo, jugando con la funcionalidad de vista móvil de MVC4, noté que el código anterior no verifica si la Solicitud es de un dispositivo móvil. Entonces, si pulso esa ruta en un escritorio, la vista del escritorio se mostrará en mi teléfono hasta que se invalide el caché. Lo contrario también es cierto (si primero toco la página con un teléfono, el escritorio verá la vista móvil en su lugar).

¿Hay algún parámetro que pueda usar para hacer que esto funcione como esperaba o estoy buscando crear un cliente OutputCacheProvider?

Respuesta

25

Después de un poco más de búsqueda, encontré una solución al problema.

Controlador Actualizado Acción

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

Anulación GetVaryByCustomString en 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

muy interesante, estoy teniendo una si problema de milar, gracias! – Pelle

+1

El cambio a la vista de escritorio no funciona con este código. La página simplemente se actualiza en lugar de cambiar. Use context.GetVaryByCustomStringForOverriddenBrowser() en su lugar. –

5

Este método es correcta GetVaryByCustomString

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