テキストボックス、いくつかのバリデーター、およびいくつかの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コレクションに表示され、適切に動作します。
私は間違っていますか?
私は、コンポジットコントロールの外側にバリデータを作成し、カスタムコントロールコレクションに渡そうとしているため、この問題が発生していることを発見しました。 CreateChildControlsメソッドで単にバリデータを作成すると、正しく動作します。 – Devin