在UserControl中包装CustomValidator,但允许访问它

时间:2010-05-25 19:23:54

标签: asp.net validation customvalidator

我有一个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)

1 个答案:

答案 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;