我理解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或以某种方式保留此刷新信息。有什么提示吗?
答案 0 :(得分:7)
您可以使用看起来像这样的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进行检测。
答案 1 :(得分:2)
如果您使用的是MVC 2或3,则TempData不会在后续请求中过期,而是在下次读取时过期。
http://robertcorvus.com/warning-mvc-nets-tempdata-now-persists-across-screens/