避免动态创建控件的回发

时间:2012-05-17 19:34:11

标签: asp.net

我有一个页面,当用户浏览一系列问题时,动态生成控件。

当他们完成表单后,他们会单击一个提交按钮,我会收集他们输入的信息并将其存储在数据库中。

目前,我正在使用

创建其中几个控件
.AutoPostBack = True

因此,每次用户将文本和制表符更改为下一个字段时,都会发生回发,并且下一个字段会失去焦点。

如果我设置

.AutoPostBack = False

然后焦点问题消失了,但最后当我收集数据时,用户在这些控件中输入的内容实际上都不可用于客户端代码,因为它还没有发布。

我想做以下其中一项:

  1. 最后有一个大回发
  2. 在我离开时,有标准的回发而不会失去对控件的关注
  3. 我没有想到的其他东西......?
  4. 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

自从我搞砸了这些已经有一段时间了,但我记得需要重新添加动态控件(页面加载或初始化?我忘了),确保我为每个动态添加的控件保证相同的ID在我可以从ViewState访问任何用户输入的数据之前添加它。

我还记得使用SessionState跟踪我添加的内容,因此我知道我需要为ViewState构建什么。

它感觉就像它现在所说的那样。祝你好运。

答案 1 :(得分:2)

动态创建控件的关键是在页面生命周期中 时添加控件。要保留视图状态并让动态控件保持已发布的值,需要在OnInit()之前添加控件。

此外,需要在 每个 页面加载,回发与否重新添加控件。关于@KennyZ关于为每个控件保证相同ID的说法,只要您以相同的顺序添加相同数量的控件,.NET将保证ID是相同的。

关于AutoPostBack属性,当我们想要执行由用户更改控件值触发的某些操作时,通常只将其设置为True。一个常见的例子是下拉列表;根据用户选择的内容,将不同的数据加载到页面的详细信息部分。因此,每次用户更改值时,我们都希望回发并获取要显示的新数据。

根据我对您的用例的理解,我建议对整个表单进行一次回发。