0

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

4

1 回答 1

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。

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

    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;
于 2011-03-09T16:46:54.170 回答