我必须为我的工作编写 ASP VB.net Web 表单。我有两个文本框,
txtA
和txtB
,当它们的内容更改时,我想在服务器上处理它以保存更改。 (注意:我不希望每次击键都会更新,就像这里提出的很多问题一样。我只是在寻找当用户按下回车键或单击发送事件的框时,这是迄今为止正在发生的)。
在 ascx 代码中的两个标签上,我都包含了
AutoPostBack="true"
,并且我编写了一个事件处理程序来包含我想要的行为。它看起来像这样:
Private Sub TextUpdated(sender As Object, e As EventArgs) Handles txtA.TextChanged, txtB.TextChanged
SaveChanges(txtA.Text, txtB.Text)
End Sub
当然这是一种简化,但它表达了要点。我已经确认该处理程序正在被调用并且似乎表现正确,唯一的问题是
txtA.Text
和 txtB.Text
的值在我们到达事件处理程序之前就被恢复了。例如,如果 txtA.Text
是 'foo' 且 txtB.Text
是 'bar',并且用户将 txtA
的内容更新为 'bar',则会引发 TextChanged
事件,并且 TextUpdated
会被触发。被调用,但 txtA.Text
的值仍然是 'foo'。
我通过输入
TextUpdated
后记录文本框的值来确认这一点。这确认了事件正在引发,并且文本框的内容没有更新。
无需更多标记和代码的最佳猜测?
请记住,对于所有此类页面,任何按钮单击、任何组合框(下拉列表)或具有自动回发功能的文本框?
加载事件页面每次都会触发,并在相关事件代码存根之前运行。
结果我最后设计的200+网页?
您需要将页面加载事件中使用的任何页面设置代码、数据加载代码和常规页面设置代码放置在“不回发”存根中。
因此,这个标记:
<h3>Text box 1</h3>
<asp:TextBox ID="TextBox1" runat="server"
OnTextChanged="TextBox1_TextChanged"
AutoPostBack="true"
></asp:TextBox>
<h3>Text box 2</h3>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
背后的代码可以这样说:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
' the REAL first page load code goes here
TextBox1.Text = "Value from setup code"
TextBox2.Text = "Value from setup code"
End If
End Sub
Protected Sub TextBox1_TextChanged(sender As Object, e As EventArgs)
' copy text from Text box 1 to text box 2, but set to upper case
TextBox2.Text = TextBox1.Text.ToUpper
End Sub
因此,请记住,您的页面设置代码(在加载事件中)必须放置在所有重要的 IsPostBack 代码存根中,因为由于某些控制而导致的任何和所有和每个回发都将首先运行页面加载,并且执行所以每次回发时,代码存根都会运行。
因此,上面的结果如下所示:
因此,检查您的页面加载代码。您希望防止代码在每次回发时一次又一次地运行,而事实确实如此。
因此,您无法使用设置代码构建工作网页,除非该设置代码放置在 Not IsPostBack 代码存根中,这实际上是您真正的首页加载事件。因此,页面加载每次都会在任何页面回发时运行。