Не может вызвать проверку на стороне клиента в составном элементе управления - PullRequest
2 голосов
/ 18 февраля 2012

У меня есть собственный составной элемент управления, который содержит текстовое поле, несколько валидаторов, а также несколько компонентов пользовательского интерфейса. Я не могу заставить клиентскую проверку работать вообще. Проверка на стороне сервера работает нормально после обратной передачи. В конечном итоге я планировал добавить пользовательский 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 просто отлично и работают соответствующим образом.

Что я делаю не так?

1 Ответ

0 голосов
/ 22 февраля 2012

Проблема была вызвана моей попыткой создать элементы управления валидатора внутри разметки asp.net, а затем передать их в составной элемент управления.По какой-то причине, которую я не совсем понимаю, жизненный цикл элемента управления валидатора казался немного испорченным, даже если они фактически никогда не добавлялись в дерево элементов управления до тех пор, пока составной элемент управления не поместил их туда.Предполагалось, что они будут созданы в разметке, настроены и загружены составным элементом управления.Я просто использовал систему шаблонов вместо свойства коллекции элементов управления.Это не совсем то, что я хотел, так как другие элементы управления могут быть добавлены, но он работает безупречно, поскольку элементы управления теперь создаются в методе CreateChildControls.Теперь это выглядит следующим образом.

    public ITemplate Validators { get; set; }

вместо

    public List<BaseValidators> Validators { get; private set; }

Метод CreateChildControls теперь выполняет стандартную реализацию шаблона

    this.ValidatorsTemplate.InstantiateIn(this.ValidatorContainer);

Затем я рекурсивно обхожу элементы управления ValidatorContainer.(осторожно, чтобы избежать бесконечной рекурсии) в поисках валидаторов, которые я настраиваю, устанавливая ControlToValidate и некоторые другие вещи.

...