Asp.net为指定类型控件统一添加事件

作者:翅膀的初衷 来源:本站原创 发布时间:2013-10-17 查看数:61427

最近在做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的点击了!