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 に答える