在服务器控件中动态创建CustomValidator

本文关键字:创建 CustomValidator 动态 服务器控件 | 更新日期: 2023-09-27 18:30:10

我有一个自定义的服务器控件,它封装了一个RadEditor(基本上是一个文本区域)。我正试图动态地添加一个CustomValidator,但在初始页面加载时,我一直收到这个错误

找不到由引用的控件id"RadEditor1""的"ControlToValidate"属性。

这是我在服务器控件中用于创建CustomValidator:的代码

protected override void OnInit(EventArgs e)
{
    var validator = new CustomValidator();
    validator.CssClass = "validator-error";
    validator.Display = ValidatorDisplay.Dynamic;
    validator.ControlToValidate = this.ID;
    validator.Text = "You've exceeded the maximum allowed length for this field";
    validator.ClientValidationFunction = "checkLength";
    this.Controls.Add(validator);
    base.OnInit(e);
}

在服务器控件中动态创建CustomValidator

问题是RadEditor实现了INamingContainer,因此ASP.NET最终会在服务器控件的子级中搜索名为RadEditor1的控件。当然,它是不成功的,因为RadEditor1没有名为RadEditor1的子控件。

我使用的技巧是选择一个像"."这样的特殊ID来表示父控件本身:

protected override Control FindControl(string id, int pathOffset)
{
    return (id == ".") ? this : base.FindControl(id, pathOffset);
}

然后使用"."作为ControlToValidate:

validator.ControlToValidate = ".";