2011-10-05 80 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

将它们嵌套在另一个用户控件中,并将该实例放在任何你希望它被缓存的地方。