【问题标题】:asp.net mvc - Detecting page refreshasp.net mvc - 检测页面刷新
【发布时间】:2012-01-04 21:03:57
【问题描述】:

我了解 StackOverflow 上关于此问题的类似问题,但都没有解决我的问题,所以我正在创建一个新问题。

正如标题所说,我想检测用户何时刷新页面。我有一个页面,我在其中保存了一些有关用户在其上所做操作的日志信息(例如添加、删除或编辑项目)。此日志只能在用户离开页面时保存,不能通过刷新来保存。

我尝试了下面的示例来检测它是刷新还是新请求:

public ActionResult Index()
{
   var Model = new Database().GetLogInfo();
   var state = TempData["refresh"];

   if(state == null)
   {
    //This is a mock structure
    Model.SaveLog(params);
   }


TempData["refresh"] = true; //it can be anything here

return View();
}

考虑到它是TempData,它应该在我的下一个操作时过期。但是,由于某种原因,它在整个应用程序中仍然存在。根据这个blog,它应该在我随后的请求中过期(除非我不明白什么)。即使我从我的应用程序中注销并再次登录,我的 TempData 仍然存在。

我一直在考虑使用 javascript 函数 onbeforeunload 对某些操作进行 AJAX 调用,但我不得不再次依赖 TempData 或以某种方式保留此刷新信息。有什么建议吗?

【问题讨论】:

  • 你用的是什么版本的asp.net mvc?
  • 这似乎很难解决。既然“做任何事情”涉及在控制器上调用一个动作,为什么不只是在完成时记录该活动,而不是在用户离开页面时记录呢?我进行了类似的审计,但我通过重写 SaveChanges 方法将所有更改推送到每个实体的相应审计表中,将其嵌入到我的数据上下文中。
  • @user182630 我正在使用 Asp.Net MVC3
  • @tvanfosson 我必须记录的一件事是用户在此页面上花费了多少时间。而且我只能在用户离开或更改它时记录它,而不是通过刷新它(考虑到他仍在同一页面上)。
  • @AdrianoRR 一个在服务器上执行触发并忘记操作以记录当前时间戳的 beforeunload 处理程序似乎是合理的,但是您将如何处理用户关闭笔记本电脑的情况页面打开?我认为这无论如何都不是一个特别可靠的数字,并且每次用户点击(非 AJAX)操作时记录一个时间戳就足够了,然后从这些时间戳计算“每次查看时间”。

标签: asp.net-mvc tempdata browser-refresh


【解决方案1】:

您可以使用如下所示的ActionFilter

public class RefreshDetectFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var cookie = filterContext.HttpContext.Request.Cookies["RefreshFilter"];
        filterContext.RouteData.Values["IsRefreshed"] = cookie != null &&
                                                        cookie.Value == filterContext.HttpContext.Request.Url.ToString();
    }
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.SetCookie(new HttpCookie("RefreshFilter", filterContext.HttpContext.Request.Url.ToString()));
    }
}

global.asax注册。然后您可以在控制器中执行此操作:

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

您可能希望改进检测以检查所使用的 HTTP 方法(因为 POST 和 GET url 可能看起来相同)。请注意,它使用 cookie 进行检测。

【讨论】:

  • 这似乎是一个很好的解决方案,但你会在每个控制器上注册它吗?考虑到我只在一个特定页面上需要这种行为,这是否明智?除此之外,我尝试了上面的示例,RouteData.Values["IsRefreshed"] 总是错误的。
  • 好的,我刚刚在您的RefreshDetectFilter 中添加了一个ActionFilterAttribute,它就像一个魅力!谢谢。
  • cookie方式对我来说似乎不是很好,当我导航到另一个页面然后返回时,仍然会刷新
【解决方案2】:

如果您使用的是 MVC 2 或 3,那么 TempData 不会在后续请求中过期,而是在下一次读取时过期。

http://robertcorvus.com/warning-mvc-nets-tempdata-now-persists-across-screens/

【讨论】:

  • 好文章。不知道 TempData 在被读取之前应该存在。您是否建议针对我的情况采取一些措施?
  • 其实我很喜欢@jgauffin的建议!
猜你喜欢
  • 2011-02-25
  • 2010-11-29
  • 2011-01-27
  • 2019-09-12
  • 2011-05-16
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多