在我的 MVC 4 Web 应用程序中,我要求用户在使用该应用程序一定天数后选择付款方式。
我通过创建一个控制器基类来实现这一点,并使我的所有控制器都继承自此。基类具有以下代码:
public class MyBaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (WebSecurity.IsAuthenticated)
{
var pay = PaymentDetails.LoadByMember(WebSecurity.CurrentUserId);
if (pay.ForceToChooseMandate)
{
filterContext.Result = RedirectToAction("Choose", "Payment");
}
}
base.OnActionExecuting(filterContext);
}
}
Choose
操作具有允许您设置付款详细信息或推迟选择一段时间的链接。如果访问了这些链接中的任何一个,则pay.ForceToChooseMandate
在后续调用中返回false
,从而允许用户恢复应用的正常运行。
第一次访问操作时,OnActionExecuting
触发并且重定向工作正常。但是,如果用户第二次访问该操作,OnActionExecuting
永远不会触发,并且他们再次被重定向到Choose
操作,即使pay.ForceToChooseMandate
这次会评估为false
他们。
但是,如果他们访问以前未访问的操作,OnActionExecuting
会按预期触发。
如何阻止这种情况的发生,并始终触发OnActionExecuting
以便始终反映用户的当前状态?
问题是第一次执行的结果被缓存了。
为了实现您想要的,您需要禁用问题中操作的缓存。您可以通过用OutputCacheAttribute
装饰这些操作来做到这一点
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
您还可以使缓存保持启用状态,但指定VaryByParam
在需要时刷新缓存。
或者,您可以使用
HttpResponse.RemoveOutputCacheItem("/Home/About");