我有一個包含文本框,一些驗證器以及多個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集合中,並且工作正常。
我在做什麼錯?
通過一個小實驗,我發現,因爲我想創建複合控件外的驗證,並將它們傳遞到定製控件集合問題肯定造成。當我在CreateChildControls方法中簡單地創建一個驗證器時,它也可以正常工作。 – Devin 2012-02-21 17:36:45