【问题标题】:Disable viewstate loading for child controls禁用子控件的视图状态加载
【发布时间】:2009-11-04 08:35:10
【问题描述】:

我有很多在 ASP.NET 页面中动态创建的 Web 控件。在某些回发场景中(当我单击链接按钮时),我想跳过加载旧的 Web 控件树并立即生成新树。不幸的是,当我生成新树时,旧树的视图状态被加载到其中。

我希望能够针对这种特定场景禁用视图状态加载过程,但是在加载新树后,视图状态应该可以正常工作。

我已经通过覆盖 Web 控件的 LoadViewState 方法解决了部分问题,但不幸的是,这会禁用特定于控件的视图状态,而不是针对他的孩子(文本框、按钮等)。

有可能吗?

谢谢。

【问题讨论】:

    标签: asp.net viewstate web-controls


    【解决方案1】:

    您可以在加载视图状态后尝试创建新树,例如在 Page_Load 中。

    【讨论】:

    • 是的,我实际上在 Page_Load 之后的 LinkBut​​ton.Clicked 事件中加载了新控件,但是 ASP.NET 的工作方式,视图状态加载将延迟到您实际将新控件加载到根控制(一个一直到页面都有父母的控制)。
    • 啊,动态添加的控件。这总是一团糟.. :) 我不知道您的代码是如何构造的,但也许您可以挂钩到动态控件加载事件并在该处理程序中创建新树?
    • 不太清楚您所说的“挂钩动态控件加载事件并在该处理程序中创建新树”是什么意思。
    【解决方案2】:

    您可以通过在将新数据绑定到树之前清除树的内容以编程方式执行此操作。应该是这样的

    tree.nodes.clear()
    

    然后你就好像树是空的一样继续,并通过限制它或通过以编程方式添加节点来添加数据

    tree.Nodes.Add(New TreeNode("name of node"))
    

    现在对于我收集到的您正在使用的常规控件,如果您不使用视图状态,您将遇到一大堆问题。您可以使用 controlname.controls.clear 以类似的方式将它们从控制树中删除。现在您的问题主要是附加这些控件还是您不想承担视图状态的负担?我建议如果是后者,您可以通过编程方式清除您的控件并将视图状态服务器端存储在某处,以便可以从内存中加载它而不是使用您的带宽。

    对于控件的动态加载,您需要确保新控件带有不同的 ID。我在其中一个应用程序中所做的实际上是保留旧控件,使它们不可见并清除视图状态,然后在下一次调用时我实际上将它们从树中删除。

    【讨论】:

    • 我并没有真正使用树。当所说的“树”时,我指的是我动态添加的控件树。我试图避免的问题是在 LinkBut​​ton.Click 上生成一个非常耗时的控件列表,只是为了让 asp.net 开心并加载 viewstate,然后忘记它们并使用新的控件集重新创建。我试图避免第一步。通常我不会花这么多时间来修改 asp.net 创建动态控件的正常行为,但正如我所说,在这种情况下,这个操作非常耗时,我想完全避免它。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多