2011-03-18 10 views
9

Tengo que caducar mi contenido para que cuando el usuario acceda al botón de navegación (atrás) de los navegadores se ejecute la acción del controlador. Entonces, en lugar de agregar el siguiente código a cada
acción, hay una mejor manera de hacerlo.Navaja MVC3: páginas vencidas

HttpContext.Response.Expires = -1; 
HttpContext.Response.Cache.SetNoServerCaching(); 
Response.Cache.SetAllowResponseInBrowserHistory(false); 
Response.CacheControl = "no-cache"; 
Response.Cache.SetNoStore(); 

Respuesta

27

Usted puede poner esta lógica en un ActionFilter lo que significa que en lugar de añadir el código anterior para cada uno de sus métodos de acción en su controlador, sólo puede decorar el método de acción con su filtro personalizado. O si se aplica a todos los métodos de Acción en un Controlador, puede aplicar el atributo a todo el Controlador.

Su ActionFilter será algo como esto:

public class MyExpirePageActionFilterAttribute : System.Web.Mvc.ActionFilterAttribute 
    { 
     public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext) 
     { 
      base.OnActionExecuted(filterContext); 

      filterContext.HttpContext.Response.Expires = -1; 
      filterContext.HttpContext.Response.Cache.SetNoServerCaching(); 
      filterContext.HttpContext.Response.Cache.SetAllowResponseInBrowserHistory(false); 
      filterContext.HttpContext.Response.CacheControl = "no-cache"; 
      filterContext.HttpContext.Response.Cache.SetNoStore(); 

     } 
    } 

Ver this artículo para más información.

Si usted quiere esto en todas las acciones de toda la aplicación, en realidad se puede aplicar un ActionFilter a todas las acciones utilizando un ActionFilter mundial establecido en el Global.asax:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    GlobalFilters.Filters.Add(new MyExpirePageActionFilterAttribute()); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 
+0

Sí, estoy de acuerdo en que necesito crear un ActionFilter. Y estaba en proceso de crear eso. Así que supongo que ese enfoque está validado en función de sus respuestas. Lo que quiero es una retroalimentación es qué va dentro del filtro theat. ¿Las 5 líneas que tengo tienen sentido o hay una mejor manera de hacerlo? Gracias. – kolhapuri

+0

@kolhapuri Ya veo, mira esto [enlace aquí] (http://stackoverflow.com/questions/1906163/how-to-force-a-page-refresh-while-pressing-the-back-button-in- mac-safari) que describe a alguien que quiere evitar que Safari guarde en caché la página anterior. – Swaff

+0

¡Encontré esto hoy y resolvió un problema que estaba teniendo! –

Cuestiones relacionadas