我在动态生成控件,有时我想创建一个控件并让它忽略视图状态。例如,有时用户点击了一个按钮,表示他们需要加载不同的表单,所以我在回发时生成的控制树与原始控制树不同。这很好,除非我调用Controls.Add时,它会尝试将旧控件的视图状态加载到新控件中,如果控件树结构相似,并且我希望它们忽略该视图状态(并且也忽略回发值也用于输入控制)。如何忽略以前的特定控件请求的视图状态?
我可以做一些事情:设置控件的ID或允许我有条件地阻止它们获取先前请求的视图状态/回发数据?
编辑:如果我让控件的用户在回发处理程序中按需加载表单,当我调用Controls.Add时,不会应用回发数据(这看起来好像是ASP.NET中的一个缺陷,因为我会认为如果你打算通过Controls.Add应用视图状态数据,那么看起来你会在视图状态数据加载后自动应用回发数据。我碰到的真正问题是我的控件是非常动态的,但是我的控件的用户在它们的回发处理程序触发之前无法真正地告诉它该做什么,因为用户可以做的其中一件事是选择不同的表单通过一些链接按钮加载。所以直到回发处理程序运行,它们才知道uesr所请求的内容,因此可以要求我的控件加载某种形式。所以我必须要求他们做一些高价值的事情,例如将标识最后一种形式的formID保存到会话变量中,然后在OnInit中他们通过属性告诉我的表单旧的formID是什么。然后,我的控件在OnLoad中加载表单,以便它可以使用视图状态和回发数据,然后在程序员的回发处理程序中,他们可以选择清除表单并根据需要加载其他表单。编辑2:FYI为表单的每个控件生成ID的工作很好,所以我想我可以消除旧表单的无意义加载,直到程序员请求在其回发处理程序中加载表单。但正如我上面提到的,我发现在回发数据处理发生后加载表单意味着数据丢失。而viewstate通过Contorls.Add加载,在页面生命周期中播放,似乎回传数据不会!所以看起来我在任何时候都被击败。
+1所有人,但我将其标记为答案,因为它直接解决了t他问关于忽视视图状态的问题。另外,即使我无法真正消除旧窗体的加载,设置ID仍然是我的解决方案的一部分,但每当我无法加载旧窗体时它将很重要,因为它不再有效,所以我可以忽略视图状态(我不会介入的长篇故事)。只需说谢谢。 – AaronLS 2010-06-17 20:40:29