2010-07-26 72 views
9

如何緩存整個頁面,除了位於頂部的一個位,如果用戶已登錄,則說明沿着"Welcome back, Matt! | Log Out"的一些內容,等等。帶動態片段的ASP.NET MVC輸出緩存

我使用ASP.NET MVC 2

+0

這有時被稱爲「甜甜圈緩存」,並不支持在asp.net mvc 2 http://stackoverflow.com/questions/2806663/donut-caching-asp-net-mvc2 – 2010-07-26 22:36:23

+0

爲什麼? o_O 有沒有其他可行的解決方案? – 2010-07-26 22:59:17

+1

我還沒有看到甜甜圈緩存的實現。您始終可以將數據緩存在控制器中,而不是緩存html輸出。 – 2010-08-04 08:46:07

回答

6

你試圖實現的是所謂的甜甜圈緩存或緩存替換。從ASP.NET MVC 2開始,沒有內置的幫助器來支持這種情況。儘管我知道這是MVC v.1中的一個計劃功能,但它在某種程度上被釋放。欲瞭解更多信息,請查閱此鏈接http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspxIs Donut Caching working properly with ASP.NET MVC?。 Oleg在這裏提到的VaryByParam選項在你的情況下不是一個好主意。如果你有VaryByParam,頁面的不同版本將被放入緩存中,以獲取每個不同的參數值(對於每個用戶名)。我個人會想到緩存數據,而不是整個頁面的輸出。

3

可能有助於

<%@ OutputCache Duration="15" VaryByParam="*" %> 

或與VaryByParam的其他值。參見http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx,http://blog.maartenballiauw.be/post/2008/06/Creating-an-ASPNET-MVC-OutputCache-ActionFilterAttribute.aspxhttp://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/18/asp-net-output-cache-provider.aspx。此外,如果您有不依賴用戶的起始頁面,可以用一個非常靜態的歡迎頁面替換爲空字段(隱藏div)而不是「Welcome back,Matt!| Log輸出」。之後,可以在客戶端啓動填寫用戶名的ajax請求。這種歡迎頁面可以非常好的緩存。

+0

在Matt的情況下,這意味着對於參數的每個值(他的情況下的每個用戶名),頁面的單獨版本將被放入緩存中。 – 2010-07-30 13:06:42

+1

好點,雖然通過ajax檢索用戶名是一個有趣的想法。我也可以嘗試從cookie中檢索用戶名,以防止向服務器發出額外的請求。 – 2010-07-31 00:37:48

+1

我以爲我們必須避免在MVC應用程序中使用'OutputCache'頁面指令並使用動作過濾器。 :S – 2010-07-31 06:53:11

0

這裏有一個解決方法解決:

*添加OuptutCache屬性來管理整個視圖作爲一般控制器:

[OutputCache(Duration = 3600, VaryByParam = "*")] 
public ActionResult Index(FormCollection formCollection) 
{ 
    //Controller code 
} 

*對於你不想做的部分緩存,使用jquery + Ajax請求加載它(具有其自己的控制器和沒有的OutputCache屬性):

<div id="loginContainer"></div> 

$(document).ready(function() { 

    $.post('controller/action', postdata, function(data) { 

    if (data.success == true) { 

     //Populate the container with the obtained data 
    } 
    }); 

}); 

該視圖將來自輸出緩存和被檢索,一旦加載,就會執行獲取登錄信息的請求。希望這將是一個非常快速的請求,用戶不會注意到延遲。

+0

當客戶端禁用JavaScript時會發生什麼情況? – 2010-08-04 14:43:32

+0

@rock它不會工作。 – Rangoric 2010-09-17 14:12:28

0

通過的NuGet得到這樣的: http://mvcdonutcaching.codeplex.com/

從Html.Partial到Html.Action添加行動LogOnPArtial,所以你可以改變它在_Layout.cshtml

@Html.Action("_LogOnPartial","Account",true) 

true是排除參數說,排除緩存。即使它所在的頁面被緩存,該操作也會被調用。這是沒有被緩存的甜甜圈中的「洞」。

在您的頁面上,例如您想要緩存的About.cshtml,應用DonutOutputCache屬性。這允許新框架在緩存頁面時檢查該頁面,並在排除操作的位置添加標誌。

好的是_LogOnPartial沒有被緩存,並且會刷新不同的用戶,而頁面的其餘部分被緩存並且About()動作將不會運行。您甚至可以在使用DonutOutputCache屬性創建的_LogOnPartial操作上配置緩存,但更頻繁或更不頻繁的時間間隔,或者因其他參數而異。這允許您編寫部分頁面,並且高速緩存刷新邏輯是針對每個部分獨立配置的。

IMO這個工具正如我想象的MVC緩存應該已經實現。