У меня есть собственный составной элемент управления, который содержит текстовое поле, несколько валидаторов, а также несколько компонентов пользовательского интерфейса. Я не могу заставить клиентскую проверку работать вообще. Проверка на стороне сервера работает нормально после обратной передачи. В конечном итоге я планировал добавить пользовательский CSS в TextBox при ошибке проверки, подключив API проверки, но я даже не могу запустить проверку на стороне клиента.
Поскольку этот элемент управления должен был быть универсальным, валидаторы не генерируются изнутри самого составного элемента управления, а передаются извне следующим образом.
<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
У меня есть производный элемент управления, который задает стандартный TextBox как 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);
}
}
Опять же, проверка на стороне сервера проходит просто отлично. Коллекция Page_Validators в javascript никогда не содержит мои валидаторы. Любые валидаторы, которые я добавляю в разметку вне моего элемента управления, отображаются в коллекции javascript просто отлично и работают соответствующим образом.
Что я делаю не так?