2012-11-16 54 views
1

我有一個約20個控制器的MVC應用程序。基於登錄用戶緩存部分

在這個應用程序中,我想將某些視圖(主要是部分)緩存60秒,即結果只會每分鐘更改一次,即使底層數據在那一分鐘內發生了變化。

似乎很簡單。

複雜的是,部分顯示依賴於當前登錄用戶的不同數據。我怎樣才能確保緩存是每個用戶使用MVC3?

+0

的重複:http://stackoverflow.com/questions/290098/asp-net -mvc-caching-vary-by-authentication – hometoast

+0

[OutputCache控制器屬性可能因用戶角色而異?這是可能的。NET MVC?](http://stackoverflow.com/questions/2289941/outputcache-controller-attribute-vary-by-user-role-is-this-possible-in-net-mvc) – hometoast

回答

3

您可以使用OutputCacheAttribute來影響控制器上的輸出緩存或逐個操作,並使用VaryByCustom

[OutputCache(Duration = 60, VaryByParam = "*", VaryByCustom="userName")] 

廣場上的控制器,然後進入你的Global.asax.cs並覆蓋GetVaryByCustomString

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if(arg.ToLower() == 「username」 && context.User.Identity.IsAuthenticated) return context.User.Identity.Name; 

    return base.GetVaryByCustomString(context, arg); 
} 
+0

當你說「放在控制器上」我假設你的意思是每個actionmethod? – KingCronus

+1

有三種選擇:1)將它放在單獨的動作上2)將它放在一個控制器上,這將導致每個動作都繼承該過濾器3)將其設置爲全局過濾器,這將導致它應用於每個動作根本不需要修改你的控制器。 http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvcglobalanddynamicactionfilters.aspx – HackedByChinese

+0

太棒了,謝謝你的幫助! – KingCronus