我有一个UserControl,它本质上只是一个TextBox,带有可选的内置验证器。目前这只是一个RequiredFieldValidator和RegexValidator。只需在UserControl上公开属性就可以很容易地传递给这些验证器,并允许我设置RegEx。
现在我想添加一个CustomValidator并允许用户添加服务器端验证功能......这给我带来了一些麻烦。这个的正确语法是什么?我尝试添加一个ServerValidateEventHandler属性,但是当我尝试使用它时,我得到一个运行时错误:
Cannot create an object of type 'System.Web.UI.WebControls.ServerValidateEventHandler' from its string representation 'valState_ServerValidate' for the 'ServerValidate' property.
我是否需要以其他方式公开委托?这应该很容易......我错过了一个小钥匙。请注意,我正在尝试将CustomValidator添加到使用UserControl的页面...我希望用户为usercontrol本身指定自定义验证的处理程序。 (是的,它有点像Frankencontrol)
答案 0 :(得分:1)
有一个简单的解决方案;而不是公共财产,使用公共事件!
public delegate void ServerValidateHandler(object sender, EventArgs e);
public event ServerValidateHandler ServerValidate;
ASP.NET将使用“On”前缀公开事件 - 因此“ServerValidate”变为“OnServerValidate”
例如,在ASPX或ASCX中,您将输入: OnServerValidate =“MyMethod”其中MyMethod是您要执行的自定义方法,它具有ServerValidateHandler委托定义的签名:
protected void MyMethod(Object sender, EventArgs e)
{
// do something...
}
如果要将特殊信息传递给处理程序,可以创建自己的eventargs类(例如 MyEventArgs:EventArgs ),并更新委托以传递该类型而不是EventArgs。
如果您需要自己访问处理程序,可以执行以下操作(此代码假定最多只有一个回调方法,但您可以通过使用一组处理程序来修改它以允许更多):< / p>
public delegate void ServerValidateHandler(object sender, EventArgs e);
private ServerValidateHandler _handler;
public event ServerValidateHandler ServerValidate
{
add { _handler = value; }
remove { _handler = null; }
}
当然,如果您不需要任何这些额外内容,那么它会简化为:
public event EventHandler ServerValidate;