【问题标题】:Vary output caching on usercontrol by clientID通过 clientID 改变用户控件上的输出缓存
【发布时间】:2011-10-05 06:22:48
【问题描述】:

我有一个用户控件,我想在其上使用输出缓存,但它多次用于不同的数据。

我考虑过使用 VaryByCustom 并尝试接收控件的 ClientID,但一直没有找到方法。

有没有办法根据 ClientID 输出缓存用户控件,或者通过它在 DOM 中的位置来识别它?

更新: 我试图添加一个隐藏字段并设置输出缓存。例如,我将隐藏字段的值设置为 Datetime.Now,但它仍然显示相同的用户控件,而不是内容不同的两个。

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

【问题讨论】:

    标签: asp.net asp.net-4.0 outputcache


    【解决方案1】:

    其中一种方法是在控件上设置一个服务器端隐藏字段,将用户控件的客户端 ID 推入其中,然后使用带有隐藏字段 ID 的 VaryByControl 参数。

    有关更多信息/选项,请参阅讨论相同问题的this MSDN link

    编辑
    使用Datetime.Now.ToString() 不是一个好主意,原因有两个!如果您看到各种控件的实际值,您会发现它是相同的,因为 ToString 的值最多为秒 - 页面上的所有控件实例将具有几乎相同的日期/时间值,可能以毫秒为单位不同这将给出相同的ToString() 值。
    第二个问题是DateTime.Now 是不确定的。要使缓存起作用,您需要具有确定性值(在重复调用中不会更改的值) - 否则对于每个页面请求,您将有一个不同的值,这将使缓存无效。我建议将用户控件的客户端 ID 作为值。另一种方法是在用户控件中公开一个属性,并将其设置为页面中的运行编号,例如 1,2,3..。

    【讨论】:

    • 我已经尝试按照所说的进行操作,但没有成功(请参阅更新后的问题)。
    • 这个解决方案似乎只适用于回发数据?我在一个页面中添加了两次相同的控件,但设置不同。如果控件是按正常方式添加的(),那不会有问题,但是我的控件是用 LoadControl 在循环中添加的,这让我陷入了 asp 中的一个错误。网。在此处查看更多信息和解决方法:devnet.kentico.com/Blogs/Martin-Hejtmanek/April-2009/…
    【解决方案2】:

    将它们嵌套在另一个用户控件中,并将其实例放在您希望缓存的任何位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2010-11-21
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多