自定义控件的服务器端事件

本文介绍如何创建自定义服务器控件以处理回发事件,并通过实现IPostBackEventHandler接口来触发服务器端Click事件的方法。文中提供了两种实现方式:一种是基于<input type=submit>的按钮控件;另一种是基于<a>标签并配合JavaScript的超链接控件。

为了使自定义的服务器控件能够处理回发事件,控件必须实现IPostBackEventHandler接口,这个接口有一个方法需要实现:void RaisePostBackEvent (string eventArgument),它用来处理将窗体发送到服务器时引发的事件。

如果我们希望实现一个按钮控件,在点击按钮时触发服务器端的Click事件,我们可以用一下代码来实现:

     

    public class MyButton : System.Web.UI.WebControls.WebControl, IPostBackEventHandler 
    ...{
        public event EventHandler Click; 

        protected virtual void onClick(EventArgs e)
        ...{
            if (this.Click != null)
            ...{
                this.Click(this, e);
            }

        }


        public void RaisePostBackEvent(string eventArgument)
        ...{
            this.onClick(new EventArgs());
        }
 

        protected override void Render(HtmlTextWriter output)
        ...{
            output.Write("<input type="submit" name="{0}" value="Click Me" />",
                this.UniqueID);
        }

    }


 

在这段代码中我们可以看到,当用户点击这个控件时,Html元素 <input type="submit"> 会引起页面的回发,因为MyButton实现了接口 IPostBackEventHandler,因此页面回发时将调用控件的 RaisePostBackEvent 方法,从而引发我们定义的 Click 事件,这样就达到了我们引发 Click 事件的目的。需注意的是引起回发的Html元素的name属性值必须为控件的 UniqueID,否则 RaisePostBackEvent 方法不会被调用。

       这个控件的实现依赖于Html元素 <input type="submit"> 本身会引发页面的回发,如果我们要自己引起回发,则需要借助一段JavaScript,这段JavaScript可以由Page. GetPostBackClientHyperlink方法(在ASP.NET 2.0这个方法已过时,而需使用Page.ClientScript.GetPostBackClientHyperlink方法),这个方法的定义为:public string GetPostBackClientHyperlink (Control control, string argument) 。其中的参数control 为处理回发的服务器控件。argument 为传递给服务器控件的参数,也就是处理回发事件的 RaisePostBackEvent 接收到的参数eventArgument。我们可以用这种方式实现一个可以定义服务器端Click事件的超链接:

 

    public class MyLink : System.Web.UI.WebControls.WebControl, IPostBackEventHandler
    ...{
        public event EventHandler Click; 

        protected virtual void onClick(EventArgs e)
        ...{
            if (this.Click != null)
            ...{
                this.Click(this, e);
            }

        }
 

        public void RaisePostBackEvent(string eventArgument)
        ...{
            this.onClick(new EventArgs());
        }
 

        protected override void Render(HtmlTextWriter output)
        ...{
            output.WriteLine("<a href="#" onclick="{0}">Click Me</a>",
                this.Page.ClientScript.GetPostBackClientHyperlink(this, ""));
        }

    }

 

   

    这个控件将在客户端呈现为 <a href="#" onclick="javascript:__doPostBack('ctl01','')">Click Me</a>,在点击这个超链接时将会运行JavaScrpit脚本,引起页面的回发,从而调用MyLink控件的RaisePostBackEvent方法。使用这种方式,无需将Html元素的name属性设置为UniqueID,但GetPostBackClientHyperlink方法的第一个参数必须是this。将GetPostBackClientHyperlink方法的第二个参数设为不同的值,我们可以给控件定义多种事件,在RaisePostBackEvent方法中根据eventArgument值的不同而进行不同的事件处理。argument也可以用来传递事件的数据。

       从上面我们可以看出脚本 __doPostBack('','') 将会引发控件的服务器端事件,因此我们设置可以将GetPostBackClientHyperlink方法形成的字符串传入JavaScript脚本,用eval()直接运行,从而做到客户端事件和服务器端事件的结合,实现更加复杂的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值