Это решение, которое использует CustomValidator и требует нескольких организационных изменений. Это требует обратной передачи, поскольку проверка CustomValidator выполняется на стороне сервера.
Вот настройка:
- Для каждого из ваших существующих RequiredFieldValidators, которые отображают сообщение «Пожалуйста, предоставьте текст для поля« Имя »», вам необходимо установить:
- EnableClientScript = "ложь"
- ValidationGroup = "vgTxtName" (укажите свое имя)
- ErrorMessage = "" (или удалите его полностью; теперь за это будет отвечать CustomValidator)
- Дисплей = "None"
- Display = "Dynamic"
- Установите текст между тегами валидатора на: *
- Не требуется никаких изменений для вашего элемента управления ValidationSummary (он должен быть нейтральным и не иметь установленного атрибута ValidationGroup, который используется по умолчанию)
- Добавить CustomValidator (см. Код ниже)
- Добавление обработчика событий для события ServerValidate в CustomValidator (вы можете просто дважды щелкнуть его в конструкторе, чтобы его сгенерировать)
- Реализация логики обработчика событий (см. Код ниже)
Идея состоит в том, чтобы напрямую не разрешать странице обрабатывать эти 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. Вам нужно будет настроить различные группировки или настроить код, если вы собираетесь использовать другие типы валидаторов.