2011-10-05 48 views
2

我有一個用戶控件,我希望使用輸出緩存,但它使用了多次不同的數據。通過客戶端ID控制usercontrol輸出緩存

我想過使用VaryByCustom並嘗試接收控件的ClientID,但一直未能找到方法。

有沒有一種方法來輸出緩存usercontrol根據ClientID,或另一種方式通過其在DOM中的位置來識別它?

更新: 我試圖添加一個隱藏的字段並設置輸出緩存。例如,我將隱藏字段的值設置爲Datetime.Now,但仍顯示相同的usercontrol,而不是兩個內容不同的人。

<%@ OutputCache VaryByControl="hidMyField" Duration="120" %> 
<asp:HiddenField runat="server" ID="hidMyField" Value="<%= Datetime.Now.ToString() %>"/> 

回答

2

其中一種方式可能是在控件上有一個服務器端隱藏字段,將用戶控件的客戶端ID插入到其中,然後使用帶有隱藏字段ID的VaryByControl參數。

有關更多信息/選項,請參閱this MSDN link討論相同的問題。

編輯
使用Datetime.Now.ToString()是不是有兩個原因一個好主意!如果你看到各種控件的實際值,你會發現它是一樣的,因爲ToString將有價值高達秒 - 頁面上的所有控件實例將具有幾乎相同的日期/時間值可能以毫秒爲單位給予相同的ToString()值。
第二個問題是DateTime.Now是非確定性的。要使緩存正常工作,您需要具有確定性值(在重複調用中不會更改的值) - 否則,對於每個頁面請求,都會有不同的值,這會使緩存失效。我建議把用戶控件的客戶端ID作爲一個值。另一種方法是在用戶控件中公開一個屬性,並將其設置爲運行編號,如1,2,3 ..

+0

我試圖做什麼說,但它沒有工作(見更新的問題)。 – Dofs

+0

@Dofs,請參閱我的編輯答案。 – VinayC

+0

此解決方案似乎只適用於回發數據?我遇到了兩次在頁面上添加了相同控件的問題,但使用了不同的設置。如果控件是以正常方式添加的(),那不會有問題,但是我的控件是在LoadControl的循環中添加的,這使我陷入了asp中的一個錯誤。淨。在此處查看更多信息和解決方法:http://devnet.kentico.com/Blogs/Martin-Hejtmanek/April-2009/How-to-dynamically-load-partially-cached-controls.aspx – tommycode

1

將它們嵌套在另一個用戶控件中,並將該實例放在任何你希望它被緩存的地方。