【问题标题】:Avoiding postbacks on dynamically created controls避免动态创建控件的回发
【发布时间】:2012-05-17 19:34:11
【问题描述】:

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

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

目前,我正在创建几个这样的控件

.AutoPostBack = True

因此,每次用户将文本和选项卡更改到下一个字段时,都会发生回发,并且下一个字段会失去焦点。

如果我设置

.AutoPostBack = False

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

我想执行以下操作之一:

  1. 最后有一个大回发
  2. 在我离开控件时进行标准回发,而不会失去对控件的关注
  3. 还有什么我没想到的...?

有什么建议吗?

【问题讨论】:

  • 您可以在回发之间使用视图状态存储和检索数据。

标签: asp.net


【解决方案1】:

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

此外,需要在每次页面加载时重新添加控件,无论是否回发。关于@KennyZ所说的保证每个控件的ID相同,只要您以相同的顺序添加相同数量的控件,.NET就会保证ID相同。

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

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

【讨论】:

    【解决方案2】:

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

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

    当时感觉就像现在描述它听起来一样笨拙。祝你好运。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      相关资源
      最近更新 更多