2012-04-06 98 views
0

我有一个自定义服务器控件,它封装了一个RadEditor(基本上是一个textarea)。我想一个的CustomValidator动态地添加到它,但我不断收到初始页面加载在服务器控件中动态创建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); 
} 
+0

请问您的服务器控件派生自' RadEditor'? – 2012-04-06 16:27:58

+0

是的,它的确如此。 '公共类RichTextEditor:RadEditor {}' – msigman 2012-04-06 16:28:55

回答

1

的问题是,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 = "."; 
+0

辉煌。完美工作。 – msigman 2012-04-06 17:07:26

+2

添加“..”用于引用父级。可能有用一天。 :) – 2012-04-09 01:05:27