2012-03-07 26 views
12

我正在將應用程序從MVC3升級到MVC4,並注意到我認爲的東西(希望?)會「正常工作」。ASP.Net MVC4 Mobile-Aware OutputCache

CODE:

[OutputCache(Duration = 600, VaryByParam = "none")] 
public ActionResult Index() 
{ 
    return View(); 
} 

這是一個教科書高速緩存例如用於ASP.Net。無論瀏覽器何時訪問該頁面,它都會檢查緩存以查看是否存在某些內容,如果不存在則生成該視圖,然後發送緩存的結果。

This works great;然而,隨着MVC4的移動視圖功能,我注意到上述代碼不檢查是否來自移動設備的請求。因此,如果我在桌面上點擊該路線,桌面視圖將顯示在手機上,直到緩存失效。反過來也是如此(如果我首先用手機打開頁面,則桌面將會看到移動視圖)。

是否有一個參數可以用來完成這項工作,就像我希望或正在構建客戶OutputCacheProvider一樣?

回答

25

經過多一點挖掘,我找到了問題的解決方案。

更新控制器動作

[OutputCache(Duration = 600, VaryByCustom = "IsMobile")] 
public ActionResult Index() 
{ 
    return View(); 
} 

覆蓋在Global.asax中GetVaryByCustomString

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom.ToLowerInvariant() == "ismobile" && context.Request.Browser.IsMobileDevice) 
    { 
     return "mobile"; 
    } 
    return base.GetVaryByCustomString(context, custom); 
} 
+0

很有意思,我有一個SI毛里求斯問題,謝謝! – Pelle 2012-03-08 08:21:53

+1

切換到桌面視圖不適用於此代碼。該頁面只是刷新而不是切換。改爲使用context.GetVaryByCustomStringForOverriddenBrowser()。 – 2013-10-21 23:29:27

5

這是正確的GetVaryByCustomString方法

public override string GetVaryByCustomString(HttpContext context, string custom) 
    { 
     if (custom.ToLowerInvariant() == "ismobile") 
     { 
      return context.GetVaryByCustomStringForOverriddenBrowser(); 
     } 
     return base.GetVaryByCustomString(context, custom); 
    }