Controller.OnActionExecuting首次访问操作后未触发

时间:2014-12-23 22:18:27

标签: c# asp.net asp.net-mvc onactionexecuting

在我的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始终触发,以便始终反映用户'现状?

1 个答案:

答案 0 :(得分:2)

问题是首次执行的结果是缓存

为了达到您想要的效果,您需要禁用缓存以解决问题中的操作。您可以通过装饰这些操作OutputCacheAttribute

来实现此目的
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]

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

或者,您可以使用

从其他操作中删除操作的缓存
HttpResponse.RemoveOutputCacheItem("/Home/About");