【问题标题】:Refresh detect filter is always true刷新检测过滤器始终为真
【发布时间】:2018-02-10 19:56:15
【问题描述】:

我正在使用此代码来确定我的页面是否已刷新,但它总是返回为 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.
}

【问题讨论】:

    标签: asp.net-mvc custom-action-filter


    【解决方案1】:

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

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

    虽然,如果您查看MVC life cycle overview,操作过滤器事件并没有真正与 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 的查询字符串参数。很难判断这是您的意图还是不希望的副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多