3

在我的 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一直开火,这样它才能始终反映用户的当前状态?

4

1 回答 1

2

问题是您第一次执行的结果被缓存了。

为了达到您想要的效果,您需要为有问题的操作禁用缓存。你可以通过装饰那些动作来做到这一点OutputCacheAttribute

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]

您还可以保持启用缓存,但指定VaryByParam在需要时刷新它。

或者,您可以通过使用从另一个操作中删除一个操作的缓存

HttpResponse.RemoveOutputCacheItem("/Home/About");
于 2014-12-23T22:43:26.257 回答