处理ASP.NET文本框中的ENTER按钮

处理ASP.NET文本框中的ENTER按钮,asp.net,textbox,postback,Asp.net,Textbox,Postback,我在ASP.NET中遇到了以下问题:有一个表单包含一个文本框及其旁边的一个按钮,用户应该在填充该框后按下该按钮(在示例中,单击“选择一个”,或在弹出窗口中使用ReCaptcha)。相反,用户通常按ENTER键提交表单 这不会导致触发按钮上的单击事件,并可能导致意外行为。在burnthespam中,我“尝试”通过检查文本框中是否有数据来解决问题(但现在如果您执行的操作与按ENTER不同,就好像您按了它)来解决问题 您知道是否有其他方法可以使用ENTER键处理表单提交,或者当您按下ENTER按钮时,

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

这不会导致触发按钮上的单击事件,并可能导致意外行为。在burnthespam中,我“尝试”通过检查文本框中是否有数据来解决问题(但现在如果您执行的操作与按
ENTER
不同,就好像您按了它)来解决问题

您知道是否有其他方法可以使用
ENTER
键处理表单提交,或者当您按下
ENTER
按钮时,是否有Javascript片段可以处理表单提交

编辑 我想在服务器端处理ENTER key事件,即我已经有了

protected void button_Click(object sender, EventArgs e)
    {
        Response.Redirect(...);
    }
我希望不仅当我使用按钮提交表单时(单击或突出显示空格),而且当用户在聚焦文本框时按下
ENTER
时,都能调用该方法

编辑2
您知道是否可以通过编程方式单击Javascript中的按钮?也许不可能阻止网络钓鱼/垃圾邮件(例如,请参阅Facebook和“分享给朋友”),但我仍然想问…

有一些方法可以使用面板的form object DefaultButton属性或DefaultButton属性设置默认按钮,但我发现过去在各种浏览器中它们都不可靠,所以我通常依赖javascript

这段代码唯一的缺点是必须使用page指令关闭事件验证,但它应该触发click事件,并触发验证器等等

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

<%@ 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>

受保护的void cmdSubmit1\u单击(对象发送方,事件参数e)
{
litValue.Text=“值1-您输入:”+txtValue1.Text;
}
受保护的void cmdSubmit2\u单击(对象发送方,事件参数e)
{
litValue.Text=“值2-您输入:”+txtValue2.Text;
}
/// 
///此函数根据当前具有焦点的控件注册单击的按钮
///因此,例如,如果用户密码字段具有焦点,则可以使enter按钮单击
///据我所知,如果按下回车键,ie和firefox都能正常工作
/// 
/// 
/// 
私有无效注册表默认按钮(System.Web.UI.Control控件带焦点,System.Web.UI.Control控件单击)
{
PostBackOptions p=新的PostBackOptions(ControlToClick);
p、 性能验证=真;
如果(ControlToClick是按钮)
{
p、 ValidationGroup=((按钮)ControlToClick).ValidationGroup;
}
else if(ControlToClick是图像按钮)
{
p、 ValidationGroup=((ImageButton)ControlToClick).ValidationGroup;
}
else if(ControlToClick是链接按钮)
{
p、 ValidationGroup=((链接按钮)ControlToClick.ValidationGroup;
}
p、 RequiresJavaScriptProtocol=false;
AttributeCollection a=null;
if(ControlWithFocus为HtmlControl)
{
a=((System.Web.UI.HtmlControls.HtmlControl)ControlWithFocus)属性;
}
else if(ControlWithFocus为网络控制)
{
a=((System.Web.UI.WebControls.WebControl)ControlWithFocus)属性;
}
如果(a!=null)
{
a[“onKeyDown”]=string.Format(“if(event.keyCode==13){{{{0}}}”
,ControlToClick.Page.ClientScript.GetPostBackEventReference(p));
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
RegisterDefaultButton(txtValue1,cmdSubmit1);
RegisterDefaultButton(txtValue2,cmdSubmit2);
}
输入值1:

输入值2:
隐藏按钮1
您可以尝试以下方法:

<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>

功能测试(e){
var-keynum;
if(window.event)//IE
{
keynum=e.keyCode
}
else if(e.which)//Netscape/Firefox/Opera
{
keynum=e
}   
如果(keynum==13)uu doPostback('yourButtonId','');
}

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

以下是一种更简单的方法,适用于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>

我刚刚注意到,在Firefox工作时,IE8只是忽略了您的代码,只需稍加修改。这可能是因为TextBox是gaia:TextBox,来自gaia AJAX WebWidgets,只在回发后出现吗?我仔细检查了生成的HTML是否与按钮单击的HTML匹配,我甚至不必禁用事件验证(因为在FF中是有效的),但我仍然得到一个空的HTTP(不是像FF那样的AJAX)回发,这很奇怪。如果javascript在那里,并且看起来像按钮上的javascript,并且按钮可以工作,那么人们会认为文本框上的脚本应该具有相同的结果。有没有可能gaia文本框也正在注册onKeyDown事件,这导致它实际上没有调用内联脚本。您应该尝试脚本调试器,看看是否实际调用了dopostback方法。正在尝试使用此。。。我通过将onkeyevent替换为
textbox1.Attributes.Add("onkeypress", "return clickButton(event,'" + buttonName1.ClientID + "')");