Asp.net 将CustomValidator包装在UserControl中,但允许访问它

Asp.net 将CustomValidator包装在UserControl中,但允许访问它,asp.net,validation,customvalidator,Asp.net,Validation,Customvalidator,我有一个UserControl,它本质上只是一个文本框,带有可选的内置验证器。目前,这只是一个RequiredFieldValidator和RegexValidator。很容易只公开UserControl上的属性,这些属性将传递给这些验证器,并允许我设置RegEx 现在我想添加一个CustomValidator并允许用户添加一个服务器端验证函数。。。这给我带来了一些麻烦。这个的正确语法是什么?我尝试仅添加ServerValidateEventHandler属性,但当我尝试使用此属性时,会出现运行

我有一个UserControl,它本质上只是一个文本框,带有可选的内置验证器。目前,这只是一个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.

我是否需要以其他方式公开委托?这应该很容易。。。我少了一把小钥匙。请注意,我正在尝试向使用UserControl的页面添加CustomValidator。。。我希望用户为usercontrol本身的自定义验证指定一个处理程序。(是的,这有点像Frankencontrol)

有一个简单的解决方案;使用公共事件而不是公共属性

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

如果您需要自己访问处理程序,可以执行以下操作(此代码假定最多只有一个回调方法,但可以通过使用处理程序集合对其进行修改以允许更多回调方法):

当然,如果您不需要这些额外功能,那么它可以简化为:

public event EventHandler ServerValidate;
public event EventHandler ServerValidate;