2

我知道 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它应该在我的下一步行动中过期。但是,由于某种原因,它在整个应用程序中仍然存在。根据这个博客,它应该在我随后的请求中过期(除非我不明白)。即使我从我的应用程序中注销并再次登录,我的 TempData 仍然存在。

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

4

2 回答 2

8

您可以使用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 进行检测。

于 2011-11-23T15:31:47.407 回答
2

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

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

于 2011-11-23T15:18:55.123 回答