gpt4 book ai didi

c# - 第一次访问操作后,Controller.OnActionExecuting 未触发

转载 作者:行者123 更新时间:2023-11-30 16:56:42 27 4
gpt4 key购买 nike

在我的 MVC 4 网络应用程序中,我要求用户在使用该应用程序一定天数后选择一种付款方式。

我通过创建一个 Controller 基类并使我所有的 Controller 都继承自它来实现它。基类有如下代码:

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 始终触发,以便它始终反射(reflect)用户的当前状态?

最佳答案

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

为了实现您想要的效果,您需要为问题中的操作禁用缓存。您可以通过使用 OutputCacheAttribute

装饰那些 Actions 来做到这一点
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]

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

或者,您可以使用

从另一个操作中删除操作的缓存
HttpResponse.RemoveOutputCacheItem("/Home/About");

关于c# - 第一次访问操作后,Controller.OnActionExecuting 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27628830/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com