【问题标题】:Wrap CustomValidator in a UserControl, but allow access to it将 CustomValidator 包装在 UserControl 中,但允许访问它
【发布时间】:2010-05-25 19:23:53
【问题描述】:

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

【问题讨论】:

    标签: asp.net validation customvalidator


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 1970-01-01
      • 2013-07-31
      • 2011-10-13
      • 2012-09-29
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多