[小菜一碟] ASP.NET MVC 如何在按上一頁瀏覽歷程記錄後,顯示更新的內容?

有一些網頁的內容是有時效性的,甚至有一些操作是不可逆的,但是瀏覽器的歷程記錄(History)卻會逆轉這些特性,在使用者按下「上一頁」的那一刻,不該出現的卻出現了、不該消失的卻消失了,怎麼會這樣?

這個跟瀏覽器的 Cache 策略有關係,我們開發的 ASP.NET MVC 應用程式部署在 IIS 上時,預設的回應標頭 Cache-Control 會帶 private 值。

這是什麼意思? 意思就是說允許瀏覽器在本地端緩存這一次的回應結果,這會使得使用者在按上一頁下一頁瀏覽歷程記錄的時候,瀏覽器不會重新發送要求,而是輸出緩存的結果,這就造成不該出現的卻出現了、不該消失的卻消失了的現象,底下是一個案例,在新增資料後網頁沒有重新導向回列表頁,使用者沒辦法只好按上一頁,而剛剛新增的資料卻消失了,必須重新整理網頁才會出現。

如果我們不需要瀏覽器這麼多事,該怎麼做? 其實只要告訴瀏覽器不要緩存這一頁的結果就好了,在 Cache-Control 塞入這三個值 no-cacheno-storemust-revalidate 瀏覽器就不會緩存回應結果,那要怎麼塞? 只要在該 Action 中加入下面兩行程式碼就行了。

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");

我們也可以做成 ActionFilter 以利在多個 Action 中重複使用

public class NoStoreAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
    }
}

加了之後,即使是用按上一頁的方法瀏覽到這一頁,瀏覽器也會重新發送要求。