2011-10-19 41 views
0

我是一個MVC初學者,今天我遇到了一個奇怪的問題:我想使用的OutputCache啓用緩存上一個action.code這樣的:輸出緩存屬性的服務器緩存錯誤?

[OutputCache(Duration=86400,VaryByParam="none")] 
    public ActionResult Index(string id) 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 
     ViewBag.ID = id; 

     return View(); 
    } 

注意「的VaryByParam」屬性爲「無」 ,是的,我希望服務器只保留一個緩存的行動,無論param傳遞。 和路由代碼是這樣的:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

    } 

然後我打開了探索,結果不是我想要的東西,比如我輸入:「HTTP://本地主機:27654 /首頁/指數/ 121212」,頁面出來並顯示id「121212」。但是當我更改爲「http:// localhost:27654/home/index/12」時,並且我看到頁面已更改,則顯示了id「12」。

但如果我刷新頁面(para「id」不變),頁面中顯示的日期時間沒有改變,意味着asp.net保持緩存VaryBy爲「ID」段,而不是我的設置。 有什麼不對?

+0

的http://計算器.COM /問題/ 2198388 /緩存與 - 變化逐routevalue http://stackoverflow.com/questions/4518671/does-varybyparam-also-read-routedata-values – user960567

回答

1

是的。這是因爲您通過路由中預定義的參數創建了另一個頁面示例。

[OutputCache(Duration=86400,VaryByParam="none")] 
    public ActionResult Index(int id, string some) 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 
     ViewBag.ID = id; 
     ViewBag.Some = some; 
     return View(); 
    } 

路徑參數不能被視爲OutputCache的參數。在我的例子string some不是路線的一部分,所以如果你會嘗試緩存的新版本將無法創建例如,如果你cange參數some

而且閱讀本主題:OutputCache Bug with VaryByParam="None" with MVC RC refresh

+0

感謝,這是否意味着在一個「Http Get」場景,我不能使用Route參數,我必須使用queryString傳遞參數?在你的例子中,我必須輸入「http:// localhost:27654/home/index?some = wawa」 – Kaicui

+0

這意味着如果route.MapRoute中定義的任何參數都會更改 - 將創建新的緩存示例。/home/index/1或/ 2是路由參數,因此它將是2個緩存項目。 QueryString參數不會對緩存頁面造成任何影響,導致VaryByParam =「none」。它是否使感覺? –

+0

是的,非常感謝〜 – Kaicui