2012-04-06 56 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