我需要使我的内容过期,以便当用户点击浏览器导航(后退)按钮时,控制器操作将被执行。因此,不要将以下代码添加到每个中 行动是有更好的方法来做到这一点。
HttpContext.Response.Expires = -1;
HttpContext.Response.Cache.SetNoServerCaching();
Response.Cache.SetAllowResponseInBrowserHistory(false);
Response.CacheControl = "no-cache";
Response.Cache.SetNoStore();
答案 0 :(得分:28)
您可以将此逻辑放入ActionFilter中,这意味着您可以使用自定义过滤器装饰Action方法,而不是将上述代码添加到控制器中的每个Action方法中。或者,如果它适用于Controller中的所有Action方法,则可以将该属性应用于整个Controller。
您的ActionFilter将是这样的:
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();
}
}
有关详细信息,请参阅this文章。
如果您希望在整个应用程序的所有操作中使用此操作,您可以使用Global.asax中设置的全局ActionFilter将ActionFilter实际应用于所有操作:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalFilters.Filters.Add(new MyExpirePageActionFilterAttribute());
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
答案 1 :(得分:1)
您可以编写自己的ActionFilter
并将代码放在那里。
如果您不想使用此过滤器修饰所有操作方法,则可以将其注册为全局操作过滤器:http://weblogs.asp.net/gunnarpeipman/archive/2010/08/15/asp-net-mvc-3-global-action-filters.aspx
答案 2 :(得分:0)
您可以将其放在HTTP Module。
中