【问题标题】:autpostback with textbox in asp.net在 asp.net 中使用文本框自动回发
【发布时间】:2014-04-09 08:40:32
【问题描述】:

我有以下aspx代码

 <asp:TextBox ID="uname" runat="server" AutoPostBack="True" 
            ontextchanged="uname_TextChanged"></asp:TextBox>

在文件后面的代码中

protected void uname_TextChanged(object sender, EventArgs e)
    {
        Response.Write("Called on postback");
    }

根据我的假设,由于自动回发,如果我在文本框中写任何内容,就会发生回发,但现在也没有发生,可能是什么原因?

  • 通常有多个事件处理程序用于一个事件,例如一个控件,如果发生自动回发,将触发哪个事件。?

【问题讨论】:

  • 您是否尝试过调试?您是否尝试过将焦点从文本框中移开?因为上面写着automatic postback to the server occurs when the TextBox control loses focus

标签: c# asp.net events textbox autopostback


【解决方案1】:

你说As per my assumption due to autopostback if I write anything in the textbox a postback will occur

这是错误。当您从文本框中获得焦点时,它将触发 text changed 事件。因此,当您键入内容并按 Tab 键时,只会触发您的 TextChanged 事件。

如果您想在输入内容时触发TextChanged 事件,那么您应该使用OnKeyDown 事件从javascript 调用它。请参阅下面的代码示例:

<asp:TextBox ID="uname" runat="server" AutoPostBack="True"
    OnKeyDown="TextChanged(this)" OnTextChanged="uname_TextChanged"></asp:TextBox>


<script type="text/javascript">
    function TextChanged(control) {
        $(control).change();
    }
</script>

现在,当您在文本框中输入任何内容时,它将调用 javascript 的 TextChanged 方法,此方法将触发 uname_TextChanged 事件。

假设:

如果您的文本框控件位于 UpdatePanel 内,那么您的更改事件也无法触发。在这种情况下,您应该为文本框定义触发器。如下所述:

<asp:UpdatePanel runat="server" ID="up1">
    <ContentTemplate>
        <asp:TextBox ID="uname" runat="server" AutoPostBack="True"
            OnKeyDown="TextChanged(this)" OnTextChanged="uname_TextChanged"></asp:TextBox>
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="uname" />
    </Triggers>
</asp:UpdatePanel>

问:如果发生自动回发,会触发哪个事件?

回答: 通常情况下,对于所有在 post 服务器之间更改内容的事件,AutoPostBack 都需要。但在您为此定义事件之前,它不会被触发。

例如,如果您将 DropDownListAutoPostBack 属性设置为 true,并且如果您未指定 OnSelectedIndexChanged 事件,则不会触发该事件。但是当您更改值时,您的页面将被回发。

TextBoxCheckBoxRadioButton 等也会发生同样的情况......

希望这足以理解。

【讨论】:

  • 你也能谈谈第二部分吗?所以我可以接受它作为答案
【解决方案2】:

尝试将 ontextchanged 更改为 OnTextChanged 并尝试。并在文本框中输入文本后尝试在页面上单击鼠标确保它有效。

【讨论】:

  • 驼色箱还是小箱都无所谓
【解决方案3】:

MSDN 声明仅当控件失去焦点时才会引发 AutoPostBack:

获取或设置一个值,该值指示是否自动回发到 当 TextBox 控件失去焦点时发生服务器。

...

使用 AutoPostBack 属性指定是否自动回发 当 TextBox 控件失去焦点时,将发生到服务器。 在 TextBox 控件中按 ENTER 或 TAB 键是 改变焦点的最常用方法。

但是,测试表明您需要先输入文本才能进行回发。在我输入一些文本并从 TextBox 中跳出后,PostBack 完成并引发了 TextChanged 事件。清除文本并跳出TextBox后,AutoPostBack也完成了,所以它不取决于TextBox是否为空。

还要解决您问题的第二部分:在 PostBack 期间引发的事件由 ASP.NET 框架在 PostBack 的初始化阶段决定。例如。如果 Form 值中包含的 TextBox 的文本与 ViewState 中存储的文本不同,则会引发 TextChanged 事件。这解释了为什么即使 AutoPostback 是由失去焦点启动的,也会调用 TextChanged 处理程序。

【讨论】:

  • 我没有得到第二部分,如果在运行时确定回发,将调用哪个事件?所以开发者不确定在按钮、文本框、选择框的情况下会调用哪个事件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2017-10-11
相关资源
最近更新 更多