基于用户回发的动态控件

tbi*_*hel 5 c# asp.net event-handling dynamic-controls

假设我有一个树视图,其中每个树节点包含一组不同用户控件的 id。当用户点击一个节点时,这些控件应该被加载到页面中。据我了解 ASP 页面生命周期,应在初始化阶段添加动态控件,稍后将触发回发事件。

那么如果在我需要添加控件之后发生treeview点击事件,我该如何根据用户回发事件动态添加控件呢?


编辑:我尝试了 ArronLS 的建议:

我所做的是将节点值添加到会话数组中,并在我执行 init 时使用它来选择要加载到占位符控件的控件的表单元素。在 treeview 单击事件中,我更新会话数组中的节点,清除占位符中的旧表单元素,并将新表单元素添加到控件中。当页面再次加载时,它现在应该在初始化时找到节点,这样就可以避免视图状态问题。

现在我还没有完全测试这个,但是还有另一个类似的帖子讨论了视图状态可能导致的问题。他们提出了一个解决方案,在 Init 控件中轮询上下文的 Request[] 部分(在他们的情况下是 dropbox),手动处理一些回发功能。

我的新问题是如何使用请求数组访问树视图中的选定节点?

Aar*_*nLS 0

不在 init 中加载控件的后果是,如果视图状态中的属性发生更改,这些更改将不会保留到控件中。例如,如果在页面的第一个请求中,您在 init 中动态创建控件,然后在回发时在 init 中再次创建它们,然后在 init 之后,视图状态中的任何属性值都会应用于该控件。

因此,如果您最初在树视图单击事件中创建了该控件,我想这应该没问题,因为自刚刚创建以来,尚未累积任何视图状态以应用于该控件。但是,我不确定这是否会导致控件不保存视图状态。你必须对此进行实验。

在第一次之后的后续回发中,现在您需要在 init 中创建控件,以便将累积的 viestate 应用于它,因此您需要某种机制来“记住”您之前创建过一次控件,最初是为了响应单击事件,然后在后续回发时在 init 中再次创建控件。如果您不知道,则必须对每个请求重新创建控件。

所以问题就变成了控件的视图状态有多重要。

编辑:我还要补充一点,我不完全确定除了影响视图状态之外是否还会有其他后果。