在我的MVC 4网络应用程序中,我要求用户在使用该应用程序一段时间后选择付款方式。
我通过创建一个控制器基类来实现这一点,并使我的所有控制器继承自此。基类具有以下代码:
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
始终触发,以便始终反映用户'现状?
答案 0 :(得分:2)
问题是首次执行的结果是缓存。
为了达到您想要的效果,您需要禁用缓存以解决问题中的操作。您可以通过装饰这些操作与OutputCacheAttribute
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
您也可以保持缓存启用,但指定VaryByParam
可在需要时刷新缓存。
或者,您可以使用
从其他操作中删除操作的缓存HttpResponse.RemoveOutputCacheItem("/Home/About");