最近在做Asp.Net WebForm时,用户提交表单后,要判断如果是用户手动点击按钮(Button,此处的button是指asp.net中的服务器控件asp:button,下同)提交,要清除某个状态,如果是程序(javascript或者其它,此处JS提交不包括JS模拟按钮点击提交,下同)自动提交,则不做理会,而且此问题涉及到多个页面,而且每个页面按钮不同!如果按常规方法,手动在每个Button的Click事件中添加相关代码太过烦琐,而且以后如果一个新程序员来维护该项目时,很容易造成添加了一个新按钮,却未添加或调用相关方法的问题!
最佳方法是让程序自动判断当前请求是否用户通过按钮点击提交!
那么我们如何来进行一这判断呢?我们在后台为2个Button(Button1,Button2)绑定事件(Button1_Click,Button2_Click),在实现中,我们不管如何点击按钮,都可以对应到指定的事件上来,如果是js提交,或者HtmlButton(type等于submit的input)提交,则不会与以上事件关联,所以证明在请求提交后,WebForm是知道请求是否来源于Button的!
而WebForm中的服务器控件Button生成的Html元素是一个ID与NAME一致的submit,而根据Html的基本原理,带name的submit,它的键在POST时是不会向服务端提交的——你点击的那个除外:如
<input type="text" name="title" value="您好" /> <input type="submit" name="sure" value="确定" /> <input type="submit" name="canncel" value="取消" />
这一段代码,如果点击确定按钮,后台Request.Form取到的值是“title=您好&sure=确定”,而点击取消则会取到“title=您好&canncel=取消”,也就是说我只要获取Post数据的所有键的值,然后去页面中查询是否存在name为该值的HTML元素,且为TagName为input,type为submit即可,如果找到了,就证肯该数据是通过按钮提交的,如果没有找到,就是其它方式提交的!而WebForm也正是基于此方法来关联按钮的后台事件的(其实,按钮就是没有什么后台事件的)!
这样一来,问题就迎面而解,而且我们只要考虑服务器控件,而服务器控件生成的ID与NAME一致,我们只要在后台FindControls("键")就行了!
其实还有更简单的实现,上面的方法之所以绕得比较复杂,只是为了说明一下实现原理!我们只需要直接在页面承现前,查询Form(WebForm中只会有一个表单,而且要提交表单,又必须要有一个表单)下面的所有按钮,为它添加一个Click事件即可,那些什么查询,判断的交给WebForm去做就行了!上最终代码:
/****************** * * 作者:翅膀的初衷 * 来源:www.jiniannet.com * ***************** using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public class BasePage : System.Web.UI.Page { protected override void OnInitComplete(EventArgs e) { base.OnInitComplete(e); if (Form != null) { for (int i = 0; i < Form.Controls.Count; i++) { if (Form.Controls[i] != null) { System.Web.UI.WebControls.IButtonControl button = Form.Controls[i] as System.Web.UI.WebControls.IButtonControl; if (button != null) { button.Click += new EventHandler(AllButtonClick); } } } } } private void AllButtonClick(object sender, EventArgs e) { OnButtonClick(sender, e); } public event EventHandler ButtonClick; /// <summary> /// 按钮点击触发事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public virtual void OnButtonClick(object sender, EventArgs e) { if (ButtonClick != null) { ButtonClick(sender, e); } } }
所有页面只要继承自BasePage ,就可以通过事件ButtonClick来捕获所有来自于asp:Button与asp:ImageButton的点击了!