Validator Кошмар на динамическом управлении C # - PullRequest
3 голосов
/ 14 мая 2009

У меня есть требование добавить RequiredFieldValidator и RegularExpressionValidator в динамически создаваемое текстовое поле в динамически создаваемой табличной ячейке внутри пользовательского веб-элемента управления в области содержимого страницы, созданной из мастера.

Проблема, как вы, вероятно, можете догадаться, заключается в попытке динамически установить свойство ControlToValidate для просмотра моего динамически создаваемого текстового поля.

После некоторых исследований код теперь:

  • Создает панель (как я слышал, ControlToValidate и Validator должны находиться в одном контейнере). Первоначально это был заполнитель, но он пытался внести предложение, указанное ниже.
  • Создает текстовое поле и устанавливает его идентификатор.
  • Добавляет текстовое поле на панель.
  • Создает RequiredFieldValidator.
  • Устанавливает идентификатор ControlToValidate. Значения, которые я пытался использовать:

    • Идентификатор элемента управления
    • ClientID элемента управления
    • идентификатор элемента управления с префиксом добавленного текста, который сервер добавляет к дочерним элементам управления веб-пользователя
    • Идентификатор клиента, измененный таким же образом
    • название элемента управления (по случайности)
    • имя элемента управления с префиксом, который сервер добавляет к именам элементов управления
    • с использованием специального рекурсивного метода FindControl в попытке преобразовать новый объект Control в Textbox, а затем использовать его ID и ClientID
    • Уникальный идентификатор контроля
    • тот же, модифицированный с префиксом, как описано выше
  • Добавьте валидатор на панель.
  • Добавьте панель в ячейку стола.

Излишне говорить, что я все еще не могу убедить Валидатора «увидеть» элемент управления, который он должен проверять, и у меня совершенно нет новых способов подойти к проблеме.

РЕДАКТИРОВАТЬ: Дальнейшая детективная работа привела меня к тому, что страница не имеет проблемы, пока не закончится событие page_load. Похоже, на сервере возникла проблема после завершения выполнения кода для построения страницы. Я начинаю задаваться вопросом, добавляю ли я элементы управления в именование контейнеров слишком поздно, а не слишком рано.

Есть предложения?

Ответы [ 5 ]

1 голос
/ 14 мая 2009

Я использовал репитер в похожей ситуации:

<table>
<colgroup>
    <col style="white-space: nowrap;" />
    <col />
    <col />
</colgroup>
<asp:Repeater ID="InputFields" runat="server">
    <ItemTemplate>
        <tr>
            <td class="labelCell">
                <asp:Label id="FieldName" runat="server" Font-Bold="True" Text='<%# Eval("Name") %>'></asp:Label>:
            </td>
            <td class="fieldCell">
                <asp:TextBox id="FieldData" runat="server" autocomplete="off" />
            </td>
            <td class="errorCell">
                <asp:RequiredFieldValidator ID="FieldNameRequiredValidator" runat="server" CssClass="errorValidator" ErrorMessage='<%# Eval("Name") %> is required' 
                    ControlToValidate="FieldData" Display="Dynamic">&nbsp;&nbsp;&nbsp;</asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="FieldNameRegexValidator" runat="server" CssClass="errorValidator" ErrorMessage='A valid <%# Eval("Name") %> is required'
                    ControlToValidate="FieldData" Display="Dynamic" ValidationExpression='<%# Eval("RegEx") %>'>&nbsp;&nbsp;&nbsp;</asp:RegularExpressionValidator>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

Повторитель создает «контейнер именования», который обеспечивает уникальность идентификатора элемента управления FieldData внутри контейнера.

1 голос
/ 14 мая 2009

Как насчет создания пользовательского элемента управления, который содержит текстовое поле и два валидатора? Затем вы можете установить ControlToValidate с помощью Visual Studio, как обычно, и затем динамически добавить этот новый элемент управления в вашу ячейку таблицы.

0 голосов
/ 01 сентября 2009

Я сгенерирую texbox и валидатор обязательного поля для этого texbox внутри сетки.

Сначала я попытался использовать clientID текстового поля в качестве свойства controltovalidate для валидатора requiredfield это не может найти ошибку управления чем я дал идентификатор texbox как свойство controltovalidate для обязательного валидатора, и это сработало для меня. Код ниже возвращает RegularExpressionValidator для элемента управления, который дал в качестве первого аргумента для метода.

private RegularExpressionValidator GetRegValidator(string itemId, string regExp)
    {
        RegularExpressionValidator _regVal = new RegularExpressionValidator();
        _regVal.ControlToValidate = itemId;
        _regVal.ValidationExpression = regExp;
        _regVal.ErrorMessage ="PropertyRegexDoesNotMatches";
        _regVal.Text = "*";
        _regVal.SetFocusOnError = true;
        _regVal.EnableClientScript = true;
        _regVal.ID = string.Format("{0}Validator", itemId);
        return _regVal;
    }
0 голосов
/ 14 мая 2009

Всего пара вопросов:

  • Является ли элемент управления, который отправляет страницу назад, вызывает проверку? (если это так, убедитесь, что он не входит в отдельную группу проверки)

  • Вы уверены, что проверки не происходит? Если вы не установите свойство ErrorMessage для валидаторов, может быть легко подумать, что оно ничего не делает. (и я не вижу, чтобы вы устанавливали его в своем списке)

Изменить:

Если вы делаете что-то вроде этого:

        Panel pTest = new Panel();

        TextBox tb = new TextBox();
        for (int i = 0; i < 2; i++)
        {
            tb.ID = "tbDynamicTextBox" + i;
            pTest.Controls.Add(tb );
            RequiredFieldValidator rfv = new RequiredFieldValidator();
            rfv.ControlToValidate = tb.ID;
            rfv.ErrorMessage = "Empty textbox";
            pTest.Controls.Add(rfv);
        }
        cell.Controls.Add(pTest);

Тогда вы получите сообщение об ошибке, поскольку только один экземпляр текстового поля будет добавлен в коллекцию элементов управления. Если вы переместите 'TextBox tb = new TextBox (); 'часть внутри петли, все будет хорошо.

Я не уверен, что это ваша проблема, но стоит попробовать.

0 голосов
/ 14 мая 2009

вот пример:

Добавьте элемент управления Panel на свою страницу во время разработки с ID = "PanelHolder" (или вы можете добавить динамически).

затем динамически создайте свои элементы управления и добавьте их на эту панель следующим образом:

var myTextbox = new TextBox() {ID="myTextBox"};
PanelHolder.Controls.Add(myTextBox);
var validator = new RequiredFieldValidator() {ControlToValidate="myTextBox",Display=ValidatorDisplay.Dynamic,ErrorMessage="Required field"}
PanelHolder.Controls.Add(validator);
...