【问题标题】:Caching a user control in ASP.NET?在 ASP.NET 中缓存用户控件?
【发布时间】:2010-10-08 19:17:57
【问题描述】:

我在我的应用程序“header.ascx”中创建了一个用户控件,我将一个 selectedMenu 属性传递给该控件,该控件在该控件上选择指定的 selectedMenu 值。假设我传递了值“home”或“search”,那么它将选择(突出显示)搜索菜单。

我想缓存这个控件,当 selectedMenu 属性的值发生变化时,只有缓存会被刷新,否则它应该从缓存中获取控件??

是否可以在 asp.net 中缓存用户控件?我正在使用 ASP.NET 2.0 (C#)

【问题讨论】:

    标签: c# asp.net caching user-controls asp.net-2.0


    【解决方案1】:

    ASP.NET 中的用户控件缓存称为fragment caching。这是通过在页面顶部添加一个 OutputCache 指令来完成的:

    您不能通过设置控件的属性来改变缓存,因为如果在缓存中找到控件,则实际上并没有创建该控件。如果你试图在缓存后的代码中访问该控件,它将为空。

    判断控件是否应该被缓存的条件是否可以通过查看当前请求来判断?如果是,您可以使用输出缓存指令的 varybycustom 属性 (http://msdn.microsoft.com/en-us/library/system.web.ui.partialcachingattribute.varybycustom.aspx)。您可以将所需的任何字符串作为参数放入其中,然后在评估缓存时将调用GetVaryByCustomString() method from Global.asxa,您可以将控件是否应缓存的逻辑放在那里。

    【讨论】:

    • @Helephant,在这种情况下,我怀疑他们可能会使用 VaryByControl。
    • 是的,应该是 VaryByControl。
    【解决方案2】:

    当然可以!它被称为“片段缓存”。这是Quickstarts pageMS Knowledge base 的链接。另外,Google

    【讨论】:

    【解决方案3】:

    我认为缓存控件本身不是一个好主意:

    • 第一次创建控件时,它会引用其父页面。
    • 当您从缓存中检索控件时,这些引用不再存在。

    我认为,更好的方法是缓存控件正在使用的数据。 ASP.NET 在页面生命周期中创建了如此多的控件,缓存这一个控件实际上并没有任何改进。

    那么最后一个愚蠢的问题:这个控制是瓶颈吗?你真的需要缓存吗?

    【讨论】:

    • cahcing 用户控件在某种程度上是个好主意,因为它节省了控件的渲染时间(performance optimization)。当然,当它被缓存时,您将在页面中获得一个空引用,除非并且直到缓存过期。
    • @Zain,我想我们指的是不同的东西。缓存控件本身不会像您建议的那样节省渲染时间,但是缓存输出会这样做。
    【解决方案4】:

    总结

    使用 VaryByCustom 表示

    1- 再次构建控件。
    2-在缓存中有多个版本的控件。 自定义条件满足时使用。

    这只有在控件花费大量时间来构建并且我们有有限数量的缓存版本以不浪费内存并且应用程序需要访问控件属性(当它被缓存为“或空”时)时才有用.

    但如果 自定义条件 取决于控件属性本身,那就不好了。我无法访问它,它为空。

    例如,我想写一些类似的东西 如果(国家列表中的默认选择值不是美国) 然后重建和缓存(给它一个不同的字符串)

    否则不要

    当其他对象试图访问国家列表时,它会检查是否为空,并将国家下拉列表设置为美国。

    数据缓存将完成工作。这是唯一的方法。

    谁同意?

    感谢您的宝贵时间

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多