Page_ClientValidate() ожидаемая ошибка объекта, не может найти валидатор

У меня есть форма HomePage.aspx, содержащая пустой asp: Panel, раскрывающийся список, позволяющий пользователю выбрать SPFielType... при изменении индекса, моя страница HomePage.aspx.cs получит выбранный текст и загрузит пользовательский элемент управления внутри панели этот пользовательский элемент управления будет генерировать элемент управления, основанный на выбранном пользователем spfieldtype, и кнопку, вызывающую функцию validateForm()... моя проблема в том, что функция Page_ClientValidate() внутри аргумента validateForm() не может найти валидатор, Я также пытался дать имя группы, но все еще не работал.
Когда я помещаю кнопку внутри моей страницы aspx (не динамически динамически), она проверяет мою страницу. (<asp:Button ID="submitbutton" Text="Validate" runat="server" />).
Но когда Im визуализирует его динамически, не могу подтвердить форму. Это то, что я пытаюсь сделать:

protected override void CreateChildControls()
{
    try
    {
        fieldRenderingControl = this.CreateFieldRenderingControl(this.FieldType);
        this.Controls.Add(fieldRenderingControl);

        Button button = new Button();
        button.UseSubmitBehavior = false;
        button.Text = "ValidateButton";
        button.ID = "ValidateButton";
        button.OnClientClick = "validateForm()";
        this.Controls.Add(button);

        RequiredFieldValidator newValidator = new RequiredFieldValidator();
        newValidator.Text = "***";
        newValidator.ID = "valideee";
        newValidator.EnableClientScript = true;
        newValidator.Enabled = true;
        newValidator.SetFocusOnError = true;
        newValidator.Display = ValidatorDisplay.Dynamic;
        newValidator.ControlToValidate = fieldRenderingControl.ID;
        this.Controls.Add(newValidator);

    }
    catch (Exception ex)
    {
    }

}

//функция CreateFieldRenderingControl() генерирует элемент управления, основанный на аргументе fieldType, выбранном пользователем.

заблаговременно.

Ответ 1

У Sharepoint есть уродливая причуда, где он может назначить Guid как идентификатор элемента управления. Я видел JavaScript, который был сгенерирован Sharepoint, пытаясь использовать эти Гиды в качестве имен переменных. Это нехорошо - он разбивает скрипты - тире не разрешены в именах переменных JavaScript. Я подозреваю, что это проблема, с которой вы сталкиваетесь. И, я думаю, виновник this.CreateFieldRenderingControl(). Похоже, этот метод генерирует Id... это Id Id? Если это так, попробуйте перезаписать Id с чем-то безопасным, возможно, просто удалите тире из Guid.

fieldRenderingControl.ID.Replace("-", "");

Если это не точное решение, надеюсь, этого достаточно, чтобы вы указали в правильном направлении.

Ответ 2

После того, как вы загрузили элемент управления, проверьте управление идентификатором Firebug или просто посмотрите источник HTML, потому что есть определенные элементы управления, которые, когда вы помещаете в другие элементы управления, их идентификатор меняются при рендеринге. Если вы можете, напишите код кода htmnl.

Ответ 3

попробуйте это (имя группы пропуска в качестве аргумента в функции Page_ClientValidation)

Page_ClientValidation("group")

Ответ 4

Попробуйте следующее:

newValidator.ControlToValidate = fieldRenderingControl.ClientID;

Ответ 5

Вместо параметра Page_ClientValidate() используйте:

ValidatorValidate("id of field rendering control");

Но в одном из ваших ответов этот идентификатор "Field_4a4ab3a1-d5cc-4fbb-a212-ec5697827c75", и это не действительный идентификатор клиента. Нельзя использовать дефисы. Во-первых, убедитесь, что действительный идентификатор в клиенте.

Ответ 6

Возможно, это сообщение слишком поздно... но вот некоторые идеи...
Существует несколько возможных вещей:
(1) Валидатор и проверяемый элемент управления находятся в одной панели? Возможно, во время проверки была скрытая панель.
(2) Если вы создаете динамически, было ли это создание загружено на странице? и если да, то была создана внутри функции для проверки ввода в первый раз? Возможно, что это не обязательно. (3) Использование защищенного переопределения void CreateChildControls() в конечном итоге не выполняется во всех процессах перезагрузки, особенно если ViewState изменяет некоторые элементы управления. Вы можете разместить его на странице Загрузка.
(4) Другой альтернативой является размещение кнопки внутри панели, но видимый атрибут = false, а также валидатор с атрибутом enabled = false. Когда вы запускаете действие, вы меняете эти два государства, и вы можете работать с PostBack.