2012-02-17 11 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> 

実際にバリデータがValidatorsプロパティに追加されるようにpersistchildren属性が指定されています(私は適切だと思います)。それはうまく働いているようです。

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

は、私は、標準のTControlとしてのTextBoxなどのテキストプロパティをさらすを指定する派生コントロールを持っているが、それは本当にありません、すべての派生型です。コンポジットコントロールは、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

答えて

0

この問題は、asp.netマークアップ内でバリデータコントロールを作成し、後でコンポジットコントロールに渡すために発生しました。何らかの理由で、バリデータコントロールのライフサイクルは、コンポジットコントロールが実際にコントロールツリーに追加されるまで実際には追加されませんでしたが、ちょっと混乱しているように見えました。その目的は、それらがマークアップで作成され、コンポジットコントロールによって設定およびロードされるということでした。私は単純にコントロールコレクションプロパティの代わりにテンプレートシステムを使用しました。他のコントロールを追加することができるので、私が望んでいたものではありませんが、コントロールがCreateChildControlsメソッドでインスタンス化されているので、完璧に機能します。それは今のように見えます。代わりに

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

CreateChildControlsの方法の

public ITemplate Validators { get; set; } 

今ないバリデータを探して、標準テンプレートのインスタンス

this.ValidatorsTemplate.InstantiateIn(this.ValidatorContainer); 

私は、再帰的に(無限再帰をしないように注意)ValidatorContainerコントロールを歩いているI ControlToValidateとその他の設定を行うことで設定します。

関連する問題