0

我正在使用此代码来确定我的页面是否已刷新,但它总是返回为 true

public class RefreshDetectFilter : ActionFilterAttribute, IActionFilter
{
    //void  IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var cookie = filterContext.HttpContext.Request.Cookies["RefreshFilter"];
        filterContext.RouteData.Values["IsRefreshed"] = cookie != null &&
                                                            cookie.Value == filterContext.HttpContext.Request.Url.ToString();
    }

    //void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.SetCookie(new HttpCookie("RefreshFilter", filterContext.HttpContext.Request.Url.ToString()));
    }
}

在我的控制器中,我有属性和检查

[RefreshDetectFilter]
public class UserController : Controller

在动作方法中

if (Convert.ToBoolean(RouteData.Values["IsRefreshed"]) == true)
{
  // page has been refreshed.
}
4

1 回答 1

0

我怀疑您在请求中没有足够早地设置 cookie 以使其产生任何效果。根据MSDN

在将 ASP.NET 页面呈现给客户端之前,您必须创建 cookie。例如,您可以在 Page_Load 事件处理程序中写入 cookie,但不能在 Page_Unload 事件处理程序中写入。有关页面生命周期的详细信息,请参阅ASP.NET 页面生命周期概述

虽然,如果您查看MVC 生命周期概述,操作过滤器事件并没有真正与 ASP.NET 页面事件对齐,因此如果不进行一些实验就很难分辨。也就是说,我怀疑你需要这样做:

public class RefreshDetectFilter : ActionFilterAttribute, IActionFilter
{
    //void  IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var cookie = filterContext.HttpContext.Request.Cookies["RefreshFilter"];
        filterContext.RouteData.Values["IsRefreshed"] = cookie != null &&
                                                        cookie.Value == filterContext.HttpContext.Request.Url.ToString();

        filterContext.HttpContext.Response.SetCookie(new HttpCookie("RefreshFilter", filterContext.HttpContext.Request.Url.ToString()));
    }
}

注意:如果您以这种方式设置路由值,它将最终成为视图上生成的每个 URL 的查询字符串参数。很难判断这是您的意图还是不希望的副作用。

于 2017-10-18T06:42:19.347 回答