На обратной передаче, как я могу добавить сообщение об ошибке в сводку проверки?
Два вопроса:
При обратной передаче, когда пользователь нажимает кнопку Отправить, как я могу добавить сообщение об ошибке в сводку проверки?
Можно ли также выделить конкретное текстовое поле, используя встроенные средства проверки валидации.net?
6 ответов
Динамически создайте элемент управления CustomValidator и добавьте его непосредственно в коллекцию Page.Validators.
Dim err As New CustomValidator
err.ValidationGroup = "MyGroup"
err.IsValid = False
err.ErrorMessage = "The password is invalid"
Page.Validators.Add(err)
В отличие от добавления CustomValidator к разметке, этот метод позволяет добавлять любое количество произвольных сообщений об ошибках на основе серверной бизнес-логики.
Обратите внимание, что вы также можете добавить его на страницу напрямую, но есть несколько правил:
- Необходимо добавить элемент управления в тот же контейнер именования, что и элементы управления группы проверки.
- Если вы не хотите, чтобы сообщение проверки появлялось в произвольной позиции на странице, вам нужно будет либо добавить валидатор в определенный контейнер, либо вам придется подавить его, используя класс или стиль CSS.
Вы также можете создать собственный класс и реализовать IValidator, который позволяет добавлять сообщение одной строкой кода, но этот метод не поддерживает группы проверки.
Согласно предложению Андерса Фьелдстада, здесь представлен набор удобных методов расширения.
Imports Microsoft.VisualBasic
Imports System.Runtime.CompilerServices
Public Module PageExtensions
<Extension()> _
Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String)
p.AddValidationError(errorMessage, String.Empty)
End Sub
<Extension()> _
Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String, ByVal validationGroup As String)
Dim err As New CustomValidator
err.ValidationGroup = validationGroup
err.ErrorMessage = errorMessage
err.IsValid = False
p.Validators.Add(err)
End Sub
End Module
Добавьте пользовательский валидатор и установите его вручную IsValid
а также ErrorMessage
свойства. Вроде как это:
<asp:panel ID="ErrorsPanel" runat="server" CssClass="ErrorSummary">
<asp:CustomValidator id="CustomValidator1" runat="server"
Display="None" EnableClientScript="False"></asp:CustomValidator>
<asp:ValidationSummary id="ErrorSummary" runat="server"
HeaderText="Errors occurred:"></asp:ValidationSummary>
</asp:panel>
В коде позади:
//
// Update the database with the changes
//
string ErrorDetails;
if (!Db.Update(out ErrorDetails))
{
CustomValidator1.IsValid = false;
CustomValidator1.ErrorMessage = ErrorDetails;
}
Вот небольшое дополнение к хорошей идее от NightOwl888:
public class ValidationError : CustomValidator
{
public ValidationError(string group, string msg)
: base()
{
base.ValidationGroup = group;
base.ErrorMessage = msg;
base.IsValid = false;
}
}
public static class PageExtensions
{
public static void ErrorMessage(this Page page, string group, string msg)
{
page.Validators.Add(new ValidationError(group, msg));
}
}
Всякий раз, когда вы хотите выдать сообщение об ошибке, просто позвоните Page.ErrorMessage
; механизм такой же, как он предложил.
Ну, все, что вам нужно сделать, это создать пользовательский валидатор и добавлять его в коллекцию валидаторов на вашей странице, когда возникает условие для этого.
CustomValidator cv = new CustomValidator();
if(condition)
{
cv.IsValid = false;
cv.ErrorMessage = "This Catalog Data already exists.";
cv.ValidationGroup = "InputList";
this.Page.Validators.Add(cv);
}
ПРИМЕЧАНИЕ. Не забудьте указать группу ValidationGroup, иначе сообщение об ошибке не будет отображаться, несмотря на добавление пользовательского валидатора на вашу страницу. И да, если вы получите ответ на свой 2-й вопрос (выделение текстового поля), отправьте его!
Чтобы добавить сообщение об ошибке в сводку проверки, вы можете использовать свойство EnableClientScript ValidationSummary и другие элементы управления проверкой. Установите EnableClientScript в false для всех них:
<asp:ValidationSummary
HeaderText="You must enter a value in the following fields :"
DisplayMode="BulletList"
EnableClientScript="false"
runat="server"/>
Для выделения элемента управления нет, это невозможно с текущими элементами управления.
Но я поставил свои элементы проверки рядом со связанными элементами управления и установил их свойство Text как "*". Затем, если проверка не пройдена, она появляется рядом с ошибкой управления.
Может быть, вы можете использовать пользовательский валидатор, чтобы выделить неисправный элемент управления. Но вы должны написать свою собственную реализацию.
Вот версия приведенных выше ответов, которая является методом расширения для ValidationSummary, который заботится об идентификаторе группы проверки.
public static void AddCustomMessage(this ValidationSummary summaryControl, string message)
{
summaryControl.Page.Validators.Add(new CustomValidator {
ValidationGroup = summaryControl.ValidationGroup,
ErrorMessage = message,
IsValid = false
});
}