代码之家  ›  专栏  ›  技术社区  ›  Bryan

在用户控件中包装CustomValidator,但允许访问它

  •  0
  • Bryan  · 技术社区  · 14 年前

    我有一个用户控件,它本质上只是一个文本框,其中包含可选的内置验证器。目前这只是一个必需的fieldvalidator和regexvalidator。只公开传递给这些验证器的用户控件的属性并允许我设置regex是很容易的。

    现在我想添加一个自定义验证程序,并允许用户添加一个服务器端验证函数…这给我带来了麻烦。正确的语法是什么?我试图添加一个ServerValidateEventHandler属性,但当我尝试使用它时,会得到一个运行时错误:

    Cannot create an object of type 'System.Web.UI.WebControls.ServerValidateEventHandler' from its string representation 'valState_ServerValidate' for the 'ServerValidate' property.
    

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

    1 回复  |  直到 13 年前
        1
  •  1
  •   Bruce    13 年前

    有一个简单的解决方案;使用公共事件代替公共财产!

    public delegate void ServerValidateHandler(object sender, EventArgs e);
    public event ServerValidateHandler ServerValidate;
    

    ASP.NET将使用“on”前缀公开事件-因此“servervalidate”变为“on servervalidate”

    例如,在aspx或ascx中输入: onServervalidate=“我的方法” 其中mymethod是要执行的自定义方法,它具有由ServerValidateHandler委托定义的签名:

    protected void MyMethod(Object sender, EventArgs e)
    {
        // do something...
    }
    

    如果要将特殊信息传递给处理程序,可以创建自己的EventArgs类(例如 myEventargs:事件args ,并更新委托以传递该类型而不是事件参数。

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

        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;