在任何文本框上按Enter键会调用我的保存按钮单击事件?

时间:2009-07-23 20:42:20

标签: asp.net

我有一个标准的asp.net webform,上面有多个文本框(Autopostback = False)和一个Save按钮。
在任何文本框中按ENTER键会导致调用“保存”按钮的服务器端单击事件。如果我中断并查看调用堆栈,则单击事件是列出的唯一事件。我没有为表单设置默认按钮。 如果我在保存按钮上方放置了另一个按钮,则会在文本框上输入的任何按下时调用其单击事件。

为什么会发生这种情况,以及如何让它停止?

5 个答案:

答案 0 :(得分:3)

对于任何webform都是如此:如果在输入字段具有焦点时按Enter键,则将提交表单(textareas除外)。要阻止这种情况,您需要一些JavaScript来捕获该事件并阻止提交表单。但请注意,按Enter键提交是许多用户的预期行为!

答案 1 :(得分:3)

这是除文本区域以外的大多数字段的默认行为。

要解决此问题,您可以在提交表单之前调用javascript函数来检查按键。

<script type="text/javascript">
  function allowSubmission() {
  return !(window.event && window.event.keyCode == 13); }
</script>

然后提交表单的唯一方法是实际点击提交。然而,正如许多人所提到的,提交表单的输入键是预期的行为,因此您可以随时更改函数以对字段进行基本验证,如果已填写所有必填字段,则允许输入键提交表单。

<script type="text/javascript">
  function allowSubmission() {
  return !(window.event && window.event.keyCode == 13) || validateInput(); }
</script>

编辑:您可以在提交按钮的OnClientClick方法上调用此函数。类似的东西:

<asp:Button id="SubmitBtn" runat="server" OnClientClick="return allowSubmission()"/>

答案 2 :(得分:2)

确保您的文本框设置为Multiline as TextMode,如果没有,则输入key正在执行一个命令按钮,导致回发。

<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"></asp:TextBox>

如果您不希望文本框多行,则可以在JavaScript中截取按键命令,在按下输入时不执行任何操作。

这是一个如何

的例子
function hookUpToEnterKey()
{
    // Hook up to read enter key
    document.onkeydown = processEntryKey;
}

function processEntryKey(e)
{

    if( !e ) 
    {
        if( window.event ) 
        {
        //Internet Explorer
        e = window.event;
        } 
        else 
        {
        // Cannot get the even return.
        return;
        }
    }

    if( typeof( e.keyCode ) == 'number'  ) 
    {
        //DOM
        e = e.keyCode;
    } 
    else 
        if( typeof( e.which ) == 'number' ) 
        {
            //NS 4 compatible
            e = e.which;
        } 
        else 
            if( typeof( e.charCode ) == 'number'  ) 
            {
                //also NS 6+, Mozilla 0.9+
                e = e.charCode;
            } 
            else 
            {
                //total failure, we have no way of obtaining the key code
                return;
            }

      if(e == 13) 
      {
         // Do nothing
         return false;
      }
}

答案 3 :(得分:1)

我遇到了完全相同的问题:我有一个数据绑定网格视图,一个文本框和一个按钮。文本框用于过滤网格内容,作为搜索框。该按钮用于完全不同的动作。在按下按钮之前,按下文本框上的回车键会导致网格被过滤,这是预期的行为。但是一旦我按下按钮,在按下文本框时按下Enter键会导致按钮的onclick事件被调用。我通过将true设置为文本框的autopostback属性来修复它。我不明白为什么,但不知何故它覆盖了文本框的表单提交行为。希望它有所帮助

答案 4 :(得分:0)

您的浏览器正在尝试成为一个好人,并为您单击按钮,即使您没有将其设置为“默认”(它将在输入时“单击”表单中的第一个按钮)。 / p>

就像David说的那样,如果你想让enter键在文本框中引起换行,那么它需要是多行的