Controller.OnAction首次访问操作后不触发执行



在我的 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");

相关内容

  • 没有找到相关文章

最新更新