【发布时间】:2010-06-17 17:18:51
【问题描述】:
我正在动态生成控件,有时我想创建一个控件并让它忽略视图状态。例如,有时用户单击了一个按钮,表示他们想要加载不同的表单,因此我在回发时生成的控件树与原始控件树不同。这很好,除非当我调用 Controls.Add 时,如果控件树结构相似,它会尝试将视图状态从旧控件加载到新控件中,并且我希望它们忽略该视图状态(并且也忽略回发值也适用于输入控件)。
我可以设置控件的 ID 或允许我有条件地阻止它们获取上一个请求的视图状态/回发数据之类的操作吗?
编辑:如果我让控件的用户在回发处理程序中按需加载表单,则在我调用 Controls.Add 时不会应用回发数据(这看起来确实是 ASP.NET 中的一个缺陷,因为我认为如果您要通过 Controls.Add “事后”应用视图状态数据,那么您似乎会在加载视图状态数据后自动应用回发数据)。我遇到的真正问题是我的控件非常动态,但是我的控件的用户在他们的回发处理程序触发之前无法真正告诉它要做什么,因为用户可以做的一件事是选择不同的表单通过一些链接按钮加载。因此,直到回发处理程序运行,他们才知道 uesr 请求了什么,因此可以要求我的控件加载某个表单。所以我必须要求他们做一些重要的事情,比如将标识最后一个表单的 formID 保存到会话变量中,并且在 OnInit 中,他们通过属性告诉我的表单旧的 formID 是什么。然后我的控件在 OnLoad 中加载表单,以便它可以使用视图状态和回发数据,稍后在程序员的回发处理程序中,他们可以选择清除表单并根据需要加载不同的表单。
Edit2:仅供参考,为表单唯一的每个控件生成 ID 效果很好,所以我认为我可以消除对旧表单的无意义加载,直到程序员请求将表单加载到他的回发处理程序中。但正如我上面提到的,我发现在回发数据处理发生后加载表单意味着数据丢失。而视图状态通过 Contorls.Add 加载,在页面生命周期中追赶,似乎回发数据没有!所以看来我动不动就被打败了。
【问题讨论】: