2012-02-17 51 views
2

我有一個包含文本框,一些驗證器以及多個UI組件的自定義複合控件。我無法讓客戶端驗證工作。回發後服務器端驗證正常工作。我最終打算通過掛接驗證API向驗證失敗的TextBox添加自定義CSS,但我甚至無法運行客戶端驗證。無法在複合控件內導致客戶端驗證

由於此控件旨在是通用的,因此驗證程序不是從複合控件本身生成的,而是從外部傳入,如下所示。

<mycontrol:HighlightedTextbox ID="HighlightedTextbox1" runat="server" Label="test" CssClass="generalText" FocusedCssClass="highlightText" ErrorCssClass="errorText"> 
     <validators> 
     <asp:RequiredFieldValidator ID="required1" runat="server" ErrorMessage="Field is required" EnableClientScript="true" /> 
     </validators> 
     <prompttemplate><span>this is a prompt</span></prompttemplate> 
    </mycontrol:HighlightedTextbox> 

我有persistchildren屬性指定(我相信適當),以便驗證器實際上添加到Validators屬性。這似乎也工作得很好。

[PersistChildren(true, true), ParseChildren(true), PersistenceMode(PersistenceMode.InnerProperty)] 
    public abstract class BaseHighlightedControl<TControl> : CompositeControl 
     where TControl : Control 

我有一個派生的控制,指定標準的文本框爲的TControl以及暴露一個文本屬性,但是這確實是所有派生類型一樣。複合控件依賴於CreateChildControls方法構建控件並配置驗證器。這看起來應該是一個適當的生命週期,因爲我已經看到了在CreateChildControls方法中創建驗證器的組合控件的例子。

public List<BaseValidators> Validators { get; private set; } 

    /// <summary> 
    /// Create the child controls 
    /// </summary> 
    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     this.MainControl.ID = "HighlightControl"; 

     this.PromptTemplate.InstantiateIn(this.Prompt); 
     this.Prompt.Style.Add(HtmlTextWriterStyle.Display, "inline"); 
     this.FieldLabel.Text = this.Label; 

     if (!this.DesignMode) 
     { 
      this.Controls.Add(this.FieldLabel); 
      this.Controls.Add(this.MainControl); 
      this.Controls.Add(this.Prompt); 
      AddValidators(); 
     } 
    } 

    private void AddValidators() 
    { 
     foreach (var validator in this.Validators.OfType<BaseValidator>()) 
     { 
      validator.ControlToValidate = this.MainControl.ID; 
      validator.ValidationGroup = this.ValidationGroup; 
      validator.Display = ValidatorDisplay.Dynamic; 

      this.Controls.Add(validator); 
     } 
    } 

此外,服務器端驗證發生得很好。 JavaScript中的Page_Validators集合不會包含我的驗證器。我添加到我的控件之外的標記的任何驗證器都會出現在JavaScript集合中,並且工作正常。

我在做什麼錯?

+0

通過一個小實驗,我發現,因爲我想創建複合控件外的驗證,並將它們傳遞到定製控件集合問題肯定造成。當我在CreateChildControls方法中簡單地創建一個驗證器時,它也可以正常工作。 – Devin 2012-02-21 17:36:45

回答

0

該問題是由於我嘗試在asp.net標記內創建驗證控件,然後將它們傳遞到複合控件中引起的。出於某種原因,我不太明白,驗證控件的生命週期似乎有點亂了,即使他們從來沒有真正加入到控制樹,直到複合控件把它們放在那裏。目的是它們將在標記中創建並由複合控件進行配置和加載。我只是使用模板系統而不是控件集合屬性。由於控件現在可以在CreateChildControls方法中實例化,所以它不是我想要的,因爲可以添加其他控件。它現在看起來像這樣。

public ITemplate Validators { get; set; } 

代替

public List<BaseValidators> Validators { get; private set; } 

CreateChildControls方法現在這樣的標準模板實例

this.ValidatorsTemplate.InstantiateIn(this.ValidatorContainer); 

我然後遞歸走ValidatorContainer控制(小心,以避免無限遞歸)尋找驗證我通過設置ControlToValidate和其他一些東西進行配置。