Пользовательское форматирование ошибок проверки и проблем с деревом элементов управления - ASP.NET

У меня есть библиотека 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?

Очень признателен.


person Overflew    schedule 24.11.2009    source источник


Ответы (1)


Я не уверен, полностью ли я понимаю проблему, но, интерпретируя ваши фрагменты кода, вы смешиваете здесь две концепции:

  1. BasicTextInputLine содержит непосредственно валидатор. Я получаю эту информацию, в частности, по переменной в классе:

    частный MyRequiredFieldValidator _someValidator;

    и вы пытаетесь добавить его в список дочерних элементов управления.

  2. Валидатор - это полностью отдельный элемент управления, который относится к основной BasicTextInputLine. Я вижу это в вашей разметке:

I think these two approaches are contradictory and you have two options:

  1. Придерживайтесь подхода 1. В этом случае вы должны создать экземпляр валидатора в своем коде и удалить часть разметки.

  2. Придерживайтесь подхода 2. В этом случае классу BasicTextInputLine не нужно знать о валидаторе, т.е. удалять переменную внутри класса и не создавать ее как дочерний элемент управления. Вам это просто не нужно.

person bonifaz    schedule 18.03.2011