2011-11-23 72 views
2

据我所知,这是类似的问题在StackOverflow关于这个问题,但没有解决了我的问题,所以我创建了一个新的。asp.net mvc - 检测页面刷新

正如标题所说,我想检测用户刷新页面的时间。我有一个页面,我保存了一些关于用户完成的日志信息(如添加,删除或编辑项目)。该日志只能在用户离开页面时保存,而不能刷新。

我想下面的例子来检测,如果它是一个更新或新的要求:

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

您使用的是什么版本的asp.net mvc? – user182630

+2

这似乎是一个难以解决的问题。由于“做任何事情”涉及在控制器上调用一个动作,为什么不在完成时记录该活动,而不是在用户离开页面时?我做类似的审计,但是我通过覆盖SaveChanges方法将所有更改推送到每个实体的相应审计表中,将其嵌入到数据上下文中。 – tvanfosson

+0

@ user182630我正在使用Asp.Net MVC3 – AdrianoRR

回答

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进行检测。

+0

它似乎是一个很好的解决方案,但是你会在每个控制器上注册吗?考虑到我只在一个特定页面上需要这种行为,这是否明智?除此之外,我尝试了上面的例子,'RouteData.Values [“IsRefreshed”]总是错误的。 – AdrianoRR

+3

好吧,我刚刚添加了'ActionFilterAttribute'到你的'RefreshDetectFilter',它的工作就像一个魅力!谢谢。 – AdrianoRR