2011-11-23 73 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