У меня есть библиотека WebControl, которую я использую для визуализации наших стилизованных элементов формы. Библиотека также содержит несколько переопределенных валидаторов, так что при совместном использовании я могу визуализировать более удобный HTML / CSS валидации, чем красный-звездочка-рядом-с-полем валидатора по умолчанию. А именно, хочу выделить всю строку.
На самом базовом уровне «строка формы» может отображать:
- Outer
<div class="hasError">
<asp:Label>
<asp:TextBox>
(Оттуда есть всякие лишние свистки, AssociatedControlID ...)
Проблема, с которой я столкнулся, заключается в том, что когда элемент управления создает свой собственный переопределенный валидатор (например, управляется свойством IsRequiredField), я не могу получить ControlToValidate, чтобы настроить таргетинг на сам элемент управления.
Казалось бы, целевой ControlToValidate валидатора должен находиться на том же уровне в дереве элементов управления. И я не могу добавить его в дерево родительского контроля во время CreateChildControls, так как он выдает ошибку.
... Итак, у меня есть такой класс:
[DefaultProperty("Value"), ValidationProperty("Value")]
public class BasicTextInputLine : WebControl, INamingContainer
{
...
private Label _someLabel;
private TextBox _someTextBox;
private MyRequiredFieldValidator _someValidator;
public string Value
public bool IsRequiredField
...
}
(Примечание - флаг ValidationProperty ("Value") позволяет валидатору указывать на него)
и
public class MyRequiredFieldValidator : RequiredFieldValidator
{
...
protected override void OnPreRender(EventArgs e)
{
...
if (foundControlToValidate is BasicTextInputLine)
(foundControlToValidate as BaseFormEntry).IsValid = false;
}
Что я могу с радостью работать в разметке так:
<custom:BasicTextInputLine ID="foo" ... />
<custom:MyRequiredFieldValidator ControlToValidate="foo" ... />
Проблема:
К сожалению, при добавлении элементов в дерево элементов управления у меня возникает ошибка:
Добавление его к родительскому элементу (что дало бы рабочее дерево элементов управления) выдает ошибку о невозможности вмешательства в его набор элементов управления.
protected override void CreateChildControls()
{
...
Parent.Controls.Add(_someValidator);
}
И добавление его в элемент управления дает ошибку о том, что ControlToValidate не может быть найден.
protected override void CreateChildControls()
{
...
Controls.Add(_someValidator);
}
Как я могу структурировать это так, чтобы BasicTextInputLine создал свой собственный валидатор, и он проверял себя, а не свой внутренний TextBox?
Очень признателен.