【问题标题】:Handling ENTER button in TextBox, ASP.NET处理文本框中的 ENTER 按钮,ASP.NET
【发布时间】:2010-12-04 19:29:33
【问题描述】:

我在 ASP.NET 中遇到以下问题:有一个包含文本框和旁边的按钮的表单,用户在填写该框后应该按下该按钮(http://www.burnthespam.info 上的示例,单击“选择你的”,或者在弹出窗口中使用 ReCaptcha 时)。相反,用户通常按ENTER 键提交表单。

这不会导致按钮上的点击事件被触发并可能导致意外行为。在 burnthespam 中,我“尝试”通过检查文本框中是否有数据来解决(但现在,如果你做的事情与按下 ENTER 不同,就像你按下它一样)来解决它。

您知道是否有其他方法可以使用ENTER 键或 Javascript sn-p 处理表单提交,当您按下 ENTER 时按下我喜欢的按钮?

编辑

我想在服务器端处理ENTER键事件,即。我已经有了

protected void button_Click(object sender, EventArgs e)
    {
        Response.Redirect(...);
    }

我希望不仅在我使用按钮提交表单(单击或突出显示它的空格)时调用该方法,而且在用户聚焦文本框时按下ENTER 时调用该方法

编辑 2

您知道是否可以以编程方式点击 Javascript 中的按钮?也许无法防止网络钓鱼/垃圾邮件(例如,请参阅 Facebook 和“分享给朋友”),但我仍然想问...

【问题讨论】:

    标签: asp.net textbox postback


    【解决方案1】:

    这里有一个更简单的方法,适用于 ASP.NET:

    将此添加到您的 .aspx 页面中

    <script type="text/javascript">
            function clickButton(e, buttonid) {
                var evt = e ? e : window.event;
                var bt = document.getElementById(buttonid);
                if (bt) {
                    if (evt.keyCode == 13) {
                        bt.click();
                        return false;
                    }
                }
            }
    </script>
    

    并将其添加到您的 aspx.cs 文件中的 Page_Load

    textbox1.Attributes.Add("onkeypress", "return clickButton(event,'" + buttonName1.ClientID + "')");
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      <html>
      <head>
      <script type="text/javascript">
      function test(e){
       var keynum;
      
      if(window.event) // IE
      {
      keynum = e.keyCode
      }
      else if(e.which) // Netscape/Firefox/Opera
      {
      keynum = e.which
      }   
      if(keynum==13) __doPostback('yourButtonId', '');
      }
      </script>
      </head>
      <body>
      <input type="text" onkeypress="test(event)" />
      </body>
      </html>
      

      您需要将 'yourButtonId' 替换为 在标记中 为您的按钮呈现的 ID,即 .NET 代码中的 ClientID 属性。 __doPostback 函数是 .NET 定义的用于处理其所有回发的函数。

      【讨论】:

        【解决方案3】:

        有一些方法可以使用表单对象的 DefaultButton 属性或面板的 DefaultButton 属性来设置默认按钮,但我发现它们过去在各种浏览器中不可靠,因此我通常依赖 javascript。

        此代码的唯一缺点是您必须使用页面指令关闭事件验证,但它应该触发点击事件,并触发验证器等等。

        这是我们使用的代码示例。通常我会将注册函数放在实用程序类中,但对于本示例,它位于页面代码中。 试试这个。

        <%@ Page Language="C#" EnableEventValidation="false" %>
        
            <script runat="server">
        
                protected void cmdSubmit1_Click(object sender, EventArgs e)
                {
                    litValue.Text = "Value 1 - You entered: " + txtValue1.Text;
                }
                protected void cmdSubmit2_Click(object sender, EventArgs e)
                {
                    litValue.Text = "Value 2 - You entered: " + txtValue2.Text;
                }
        
                /// <summary>
                /// This function registers what button is clicked based on whatever control currently has focus
                /// so for example if the user password field has focus then you can cause the enter button to click
                /// if the enter key is pressed This works with ie and firefox as far as I know
                /// </summary>
                /// <param name="ControlWithFocus"></param>
                /// <param name="ControlToClick"></param>
                private void RegisterDefaultButton(System.Web.UI.Control ControlWithFocus, System.Web.UI.Control ControlToClick)
                {
        
                    PostBackOptions p = new PostBackOptions(ControlToClick);
                    p.PerformValidation = true;
                    if (ControlToClick is Button)
                    {
                        p.ValidationGroup = ((Button)ControlToClick).ValidationGroup;
                    }
                    else if (ControlToClick is ImageButton)
                    {
                        p.ValidationGroup = ((ImageButton)ControlToClick).ValidationGroup;
                    }
                    else if (ControlToClick is LinkButton)
                    {
                        p.ValidationGroup = ((LinkButton)ControlToClick).ValidationGroup;
                    }
        
                    p.RequiresJavaScriptProtocol = false;
        
                    AttributeCollection a = null;
                    if (ControlWithFocus is HtmlControl)
                    {
                        a = ((System.Web.UI.HtmlControls.HtmlControl)ControlWithFocus).Attributes;
                    }
                    else if (ControlWithFocus is WebControl)
                    {
                        a = ((System.Web.UI.WebControls.WebControl)ControlWithFocus).Attributes;
                    }
        
                    if (a != null)
                    {
                        a["onKeyDown"] = string.Format("if (event.keyCode == 13) {{{0}}}"
                              , ControlToClick.Page.ClientScript.GetPostBackEventReference(p));
                    }
                }
        
        
                protected void Page_Load(object sender, EventArgs e)
                {
                    RegisterDefaultButton(txtValue1, cmdSubmit1);
                    RegisterDefaultButton(txtValue2, cmdSubmit2);
        
                }
        
            </script>
        
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head runat="server">
            </head>
            <body>
                <form id="form1" runat="server">
                    Enter Value 1: <asp:TextBox ID="txtValue1" runat="server"></asp:TextBox>
                    <br />
                    Enter Value 2: <asp:TextBox ID="txtValue2" runat="server"></asp:TextBox>
                    <br />
                    <asp:Literal ID="litValue" runat="server"></asp:Literal>
                    <asp:LinkButton ID="cmdSubmit1" runat="server" Visible="false" OnClick="cmdSubmit1_Click">Hidden Button 1</asp:LinkButton>
                    <input id="cmdSubmit2" runat="server" visible="false" type="button" value="Hidden Button 2" onserverclick="cmdSubmit2_Click" />
                </form>
            </body>
        

        【讨论】:

        • 我刚刚注意到,您的代码几乎没有修改,在 Firefox 中工作时被 IE8 简单地忽略了。可能是因为 TextBox 是来自 Gaia AJAX WebWidgets 的 gaia:TextBox 并且仅在回发后出现?我仔细检查了生成的 HTML 是否与按钮单击匹配,我什至不必禁用事件验证(因为在 FF 中有效),但我仍然得到一个空的 HTTP(不是像 FF 那样的 AJAX)回发
        • 这很奇怪。如果 javascript 在那里,并且看起来按钮上的 javascript 并且按钮有效,那么人们会认为文本框上的脚本应该具有相同的结果。 gaia 文本框是否也可能正在注册一个 onKeyDown 事件,这导致它实际上没有调用内联脚本。你应该试试脚本调试器,看看 dopostback 方法是否真的被调用了。
        • 尝试使用它...我通过将 onkeyevent 替换为 "if (event.keyCode == 13) { alert('go'); }" ... 'go ' 每次点击输入时都会弹出警告框。但是,当我将您的原始代码放回页面时,只会刷新并且永远不会调用 LinkBut​​ton 的单击事件。有任何想法吗? (我的代码几乎与您的示例相同,只是我只有一个两个 TextBox 都在调用的 LinkBut​​ton)我正在 IE9 中对此进行测试。
        • 能够通过更改为以下内容使其工作:a["onKeyDown"] = "if (event.keyCode == 13) {" + ControlToClick.Page.ClientScript.GetPostBackEventReference(p) + "; 返回 false; }"; string.format() 没有问题,我只是在测试过程中将其删除,然后我让它像这样工作,所以保持原样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 2013-03-30
        • 2014-02-20
        • 2018-03-14
        • 1970-01-01
        • 2010-10-08
        相关资源
        最近更新 更多