2011-03-18 6 views
9

Je dois expirer mon contenu afin que lorsque l'utilisateur appuie sur le bouton de navigation (retour) du navigateur, l'action du contrôleur soit exécutée. Donc, au lieu d'ajouter le code suivant à chaque action
est-il une meilleure façon de le faire.MVC3 Razor - Expiration des pages

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

Répondre

27

Vous pouvez mettre cette logique dans un ActionFilter ce qui signifie que plutôt que d'ajouter le code ci-dessus pour chacune de vos méthodes d'action dans votre contrôleur, vous pouvez simplement décorer la méthode d'action avec votre filtre personnalisé. Ou s'il s'applique à toutes les méthodes d'action d'un contrôleur, vous pouvez appliquer l'attribut à l'ensemble du contrôleur.

Votre ActionFilter sera quelque chose comme ceci:

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

     } 
    } 

Voir this article pour plus d'informations.

Si vous voulez ceci sur toutes les actions de toute votre application, vous pouvez réellement appliquer une ActionFilter à toutes les actions en utilisant un ActionFilter global mis en place dans votre Global.asax:

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

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

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

Oui Je suis d'accord pour créer un filtre ActionFilter. Et j'étais en train de créer ça. Donc je suppose que cette approche est validée en fonction de vos réponses. Qu'est-ce que je veux un retour sur était ce qui se passe à l'intérieur du filtre de theat. Est-ce que les 5 lignes que j'ai ont du sens ou y a-t-il une meilleure façon de le faire? Merci. – kolhapuri

+0

@kolhapuri Je vois, consultez ce [lien ici] (http://stackoverflow.com/questions/1906163/how-to-force-a-page-refresh-while-pressing-the-back-button-in- mac-safari) qui décrit quelqu'un qui veut empêcher Safari de mettre en cache la page précédente. – Swaff

+0

Entré à travers cela aujourd'hui et il a résolu un problème que j'avais! –