asp.net实现取消页面表单内文本输入框Enter响应的方法
本文实例讲述了asp.net实现取消页面表单内文本输入框Enter响应的方法。分享给大家供大家参考,具体如下:
很早以前开发asp.net项目的时候遇到的:在一个服务器TextBox控件上按下Enter键,页面回发刷新一遍。后来google一下,发现这是asp.net2.0为表单处理专门设置的"Enterkey"功能,关于asp.netajax表单的enterkey,你可以查看这一篇《ASP.NET基于Ajax的Enter键提交问题》。前面给出链接的两篇都是叫我们怎么设置enterkey默认触发事件的。现在有一个新需求是这样的,录入人员在录入的时候按下enter键不提交表单(想想也是合理的,如果表单中录入框较多,一不小心按下enter键页面要回发多少次?),除非直接点击服务器端提交按钮。简单地说,就是去掉表单元素的enterkey功能。下面是我的实现:
一、初步分析和实现:
1、页面继承一个基类BasePage,基类继承自Page类,在基类中注册特定服务器控件的onkeydown脚本事件
usingSystem; usingSystem.Data; usingSystem.Configuration; usingSystem.Web; usingSystem.Web.Security; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; usingSystem.Web.UI.WebControls.WebParts; usingSystem.Web.UI.HtmlControls; publicclassBasePage:System.Web.UI.Page { publicBasePage() { } protectedoverridevoidOnInit(EventArgse) { base.OnInit(e); CancelFormControlEnterKey(this.Page.Form.Controls); } ///<summary> ///在这里我们给Form中的服务器控件添加客户端onkeydown脚步事件,防止服务器控件按下enter键直接回发 ///</summary> ///<paramname="controls"></param> publicstaticvoidCancelFormControlEnterKey(ControlCollectioncontrols) { foreach(Controlitemincontrols) { //服务器TextBox if(item.GetType()==typeof(System.Web.UI.WebControls.TextBox)) { WebControlwebControl=itemasWebControl; webControl.Attributes.Add("onkeydown","if(event.which||event.keyCode){if((event.which==13)||(event.keyCode==13)){returnfalse;}}"); } //html控件 elseif(item.GetType()==typeof(System.Web.UI.HtmlControls.HtmlInputText)) { HtmlInputControlhtmlControl=itemasHtmlInputControl; htmlControl.Attributes.Add("onkeydown","if(event.which||event.keyCode){if((event.which==13)||(event.keyCode==13)){returnfalse;}}"); } //用户控件 elseif(itemisSystem.Web.UI.UserControl) { CancelFormControlEnterKey(item.Controls);//递归调用 } } } }
这样,想取消“enterkey”功能的页面只有继承一下BasePage类即可。
2、用户控件的处理:我的思路就是在基类中继续处理用户控件内部的runat=server的控件,测试也是通过的。
3、页面中和用户控件里的没有runat=server标签的html控件,直接给这些html控件添加onkeydown事件。
下面是测试页面和其对应的类文件:
Test.aspx页面:
<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="Test.aspx.cs"Inherits="Test"%> <%@Registersrc="TestUserControl.ascx"tagname="TestUserControl"tagprefix="uc1"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <headrunat="server"> <title></title> </head> <body> <formid="form1"runat="server"> <inputtype=textid="txtTest"runat="server"/><inputid="txtTest1"type="text"name="txtTest1"onkeydown="if(event.which||event.keyCode){if((event.which==13)||(event.keyCode==13)){returnfalse;}}"/> <asp:textboxID="Textbox1"runat="server"></asp:textbox> <uc1:TestUserControlID="TestUserControl1"runat="server"/> <asp:ButtonID="btnSubmit"runat="server"Text="Submit"/> </form> </body> </html>
类:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Web; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; publicpartialclassTest:BasePage { protectedvoidPage_Load(objectsender,EventArgse) { Response.Write("123"); } }
接着是一个用户控件:
<%@ControlLanguage="C#"AutoEventWireup="true"CodeBehind="TestUserControl.ascx.cs"Inherits="MyWeb.TestUserControl"%> <asp:TextBoxID="TextBox1"runat="server"></asp:TextBox> <br/> <inputid="Text1"type="text"runat="server"/> <br/> <inputid="txtInput"type="text"name="txtInput"onkeydown="if(event.which||event.keyCode){if((event.which==13)||(event.keyCode==13)){returnfalse;}}"/>
在笔者的机器上,对TextBox,HtmlInputText和没有runat=server标签的html控件以及三者组合成的用户控件按照上面的思路按下enter键运行效果果然没有回发了。
二、脚本改进时碰到的问题
然后我看到if(event.which||event.keyCode){if((event.which==13)||(event.keyCode==13)){returnfalse;}}这一句不断地出现,就好心把它在页面里封装成JavaScript函数叫forbidInputKeyDown(ev):
<scripttype="text/javascript"> functionforbidInputKeyDown(ev){ if(typeof(ev)!="undefined"){ if(ev.keyCode||ev.which){ if(ev.keyCode==13||ev.which==13){returnfalse;} } } } </script>
然后onkeydown的方法对应的事件就是“forbidInputKeyDown(event)”(比如对于页面中服务器端的TextBox控件在注册客户端事件的时候就改写成webControl.Attributes.Add("onkeydown","forbidInputKeyDown(event)");),奇怪的是,这一次,页面又回发了?!然后脚本调试,forbidInputKeyDown函数也执行了,可是form还是被提交了。
我又看了一下脚本位置,把它从head移动到body内,问题依旧。然后怀疑是不是脚本错了?不对,脚本没错。难道是人品有问题?有问题吗,这个自信真没有。注册事件错了吗?嗯......
我kao,恍然大悟,注册事件应该这么写的:onkeydown="returnforbidInputKeyDown(event)",也就是forbidInputKeyDown函数前面加上return就好了,还是人品啊,囧。
希望本文所述对大家asp.net#程序设计有所帮助。