如何检测 ASP.NET 文本框中输入键引起的回发

How to detect postback caused by enter key in textbox in ASP.NET

Web 应用程序中的 TextBox 将在按下 Enter 时引发 TextChanged 事件,但前提是文本 具有改变了.

如果在按下 Enter 时文本 没有改变,回传仍然发生,但是 TextChanged 事件发生不是。

我想知道是否有可能确定 Enter 在文本框中被按下并导致回发,即。有没有类似下面的东西?

protected void Page_Load(object sender, EventArgs e) {
    if (sender.reasonControlName == "MyTextBox" &&
            sender.reasonControlKey == keyEnter) {
        handleEnterKey();
    }
}

ASP.Net 4

请注意,这不是关于如何禁用由 Web 应用程序中文本框中的 ENTER 键引起的回发的问题,例如whosebug.com/questions/4209903

还有一个解决方法是使用面板和 DefaultButton whosebug.com/questions/12072281,但这似乎有点麻烦。

可以将按下 Enter 的文本框的 ID 存储在隐藏字段中:

<asp:TextBox ID="txtBox1" runat="server" onkeydown="keyPressed(event, 'txtBox1');" ... />
<asp:TextBox ID="txtBox2" runat="server" onkeydown="keyPressed(event, 'txtBox2');" ... />
<asp:HiddenField ID="hiddenEnterPressed" runat="server" />

<script>
    function keyPressed(e, id) {
        if (e.keyCode == 13) {
            document.getElementById('hiddenEnterPressed').value = id;
        }
    }
</script>

注意:onkeydown 事件可以定义为 keyPressed(event, this.id),但(可能)损坏的 ID 将保存在隐藏字段中;对原始 ID 进行硬编码可以使事情变得更简单。

可以在代码隐藏中检索 TextBox 控件:

Control mainCtrl = Master.FindControl("MainContent");
TextBox txtBox = mainCtrl.FindControl(hiddenEnterPressed.Value) as TextBox;

应在每次回发时重置隐藏字段:

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    hiddenEnterPressed.Value = "";
}