asp.net mvc - обнаружение обновления страницы - PullRequest
2 голосов
/ 23 ноября 2011

Я понимаю, что аналогичные вопросы в 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 или как-то сохранять эту информацию обновления. Любые советы?

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

Вы можете использовать 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-метод (поскольку URL-адреса POST и GET могут выглядеть одинаково).Обратите внимание, что он использует cookie для обнаружения.

2 голосов
/ 23 ноября 2011

Если вы используете MVC 2 или 3, то TempData истекает не при следующем запросе, а при следующем чтении.

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

...