asp.net - проверка сетки - повторяющаяся проблема с сообщениями проверки - PullRequest
1 голос
/ 07 января 2009

У меня есть сетка, которая содержит от одной до многих строк (как большинство из них) - каждая с входным текстовым полем. У каждой строки есть обязательный поле-валидатор для этого текстового поля. Когда форма отправлена, вид сетки проверен, вполне возможно, что более чем одна строка имеет пустое текстовое поле. Это приводит к повторению проверочных сообщений, например

  • Пожалуйста, предоставьте текст для поля «Имя»
  • Пожалуйста, предоставьте текст для поля «Имя»
  • Пожалуйста, предоставьте текст для поля «Имя»

Можно ли объединить эти сообщения в одно сообщение?

Я знаю, что можно создать валидатор, настроив класс валидатора и унаследовав его от класса BaseValidator, который можно использовать для проверки вида сетки в целом. Но я помещаю изображение против каждой строки, когда оно недопустимо, поэтому я должен представить, что мне нужны отдельные валидаторы в каждой строке.

Ответы [ 2 ]

2 голосов
/ 05 июля 2009

Это решение, которое использует CustomValidator и требует нескольких организационных изменений. Это требует обратной передачи, поскольку проверка CustomValidator выполняется на стороне сервера.

Вот настройка:

  1. Для каждого из ваших существующих RequiredFieldValidators, которые отображают сообщение «Пожалуйста, предоставьте текст для поля« Имя »», вам необходимо установить:
  2. EnableClientScript = "ложь"
  3. ValidationGroup = "vgTxtName" (укажите свое имя)
  4. ErrorMessage = "" (или удалите его полностью; теперь за это будет отвечать CustomValidator)
  5. Дисплей = "None"
  6. Display = "Dynamic"
  7. Установите текст между тегами валидатора на: *
  8. Не требуется никаких изменений для вашего элемента управления ValidationSummary (он должен быть нейтральным и не иметь установленного атрибута ValidationGroup, который используется по умолчанию)
  9. Добавить CustomValidator (см. Код ниже)
  10. Добавление обработчика событий для события ServerValidate в CustomValidator (вы можете просто дважды щелкнуть его в конструкторе, чтобы его сгенерировать)
  11. Реализация логики обработчика событий (см. Код ниже)

Идея состоит в том, чтобы напрямую не разрешать странице обрабатывать эти RequiredFieldValidators, а вместо этого мы позволим CustomValidator сделать это.

Пример TextBox RequiredFieldValidator (у вас должно быть что-то похожее на это с соответствующими именами идентификаторов, что соответствует шагу 1 выше):

Вариант 1:

<asp:RequiredFieldValidator ControlToValidate="txt1" ID="rfv1" runat="server" 
EnableClientScript="false" Display="None" ValidationGroup="vgTxtName" />

Вариант 2:

<asp:RequiredFieldValidator ControlToValidate="txt1" ID="rfv1" runat="server" 
EnableClientScript="false" Display="Dynamic" ValidationGroup="vgTxtName">*
</asp:RequiredFieldValidator>

Разметка CustomValidator (вы можете разместить это где угодно, например рядом с элементом управления ValidationSummary):

<asp:CustomValidator ID="cvName" runat="server" Display="None"
ErrorMessage="Please provide text for 'Name' field" 
OnServerValidate="cvName_ServerValidate" />

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

CustomValidator EventHandler (cvName_ServerValidate):

protected void cvName_ServerValidate(object source, ServerValidateEventArgs args)
{
    // Validate vgTxtName group
    Page.Validate("vgTxtName");

    // .NET 3.5 - add using System.Linq;
    args.IsValid = Page.GetValidators("vgTxtName")
                        .OfType<RequiredFieldValidator>()
                        .All(v => v.IsValid);

    // .NET 2.0 (use either this or the above, not both)
    bool isValid = true;
    foreach (RequiredFieldValidator validator in Page.GetValidators("vgTxtName"))
    {
        isValid &= validator.IsValid;
    }
    args.IsValid = isValid;
}

Вот и все! Просто имейте в виду, что это строго для RequiredFieldValidators. Не следует помещать различные типы валидаторов в группу «vgTxtName», поскольку логика cvName имеет дело только с типом RequiredFieldValidator. Вам нужно будет настроить различные группировки или настроить код, если вы собираетесь использовать другие типы валидаторов.

0 голосов
/ 08 января 2009

Я бы предложил не использовать сводку валидатора.

Измените свойство Text или внутреннее содержимое валидаторов на что-то более подходящее для вашего приложения.

Например ...

<asp:Validator ID="X" ... runAt="server" Text="*" />

или

<asp:Validator ID="X" ... runAt="server">*</asp:Validator>

или для отображения изображения ...

<asp:Validator ID="X" ... runAt="server"><img src="../path.png" alt="Invalid" /></asp:Validator>

Я также стилизую валидатор, чтобы перейти к указателю на курсор справки, и добавлю свойство ToolTip, чтобы отобразить то же сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...