Asp.net CustomValidator никогда не запускает OnServerValidate
У меня есть следующая страница ASP:
<asp:Content ID="Content2" ContentPlaceHolderID="ShellContent" runat="server">
<form runat="server" id="AddNewNoteForm" method="post"">
<fieldset id="NoteContainer">
<legend>Add New Note</legend>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" />
<div class="ctrlHolder">
<asp:Label ID="LabelNoteDate" runat="server" Text="Note Date"
AssociatedControlID="NoteDateTextBox"></asp:Label>
<asp:TextBox ID="NoteDateTextBox" runat="server" class="textInput"
CausesValidation="True" ></asp:TextBox>
<asp:CustomValidator
ID="CustomValidator1"
runat="server"
ErrorMessage="CustomValidator"
ControlToValidate="NoteDateTextBox"
OnServerValidate="CustomValidator1_ServerValidate"
Display="Dynamic"
>*</asp:CustomValidator>
</div>
<div class="ctrlHolder">
<asp:Label ID="LabelNoteText" AssociatedControlID="NoteTextTextBox" runat="server" Text="Note"></asp:Label>
<asp:TextBox ID="NoteTextTextBox" runat="server" Height="102px"
TextMode="MultiLine" class="textInput" ></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ErrorMessage="Note Text is Required" ControlToValidate="NoteTextTextBox">*</asp:RequiredFieldValidator>
</div>
<div class="buttonHolder">
<asp:Button ID="OkButton" runat="server" Text="Add New Note"
CssClass="primaryAction" onclick="OkButton_Click"/>
<asp:HyperLink ID="HyperLink1" runat="server">Cancel</asp:HyperLink>
</div>
</fieldset>
</form>
</asp:Content>
и следующий код для метода CustomValidator1_ServerValidate():
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
if (string.IsNullOrEmpty(args.Value.Trim()))
{
args.IsValid = false;
CustomValidator1.ErrorMessage = "Note Date is Required!";
return;
}
DateTime testDate;
if (DateTime.TryParse(args.Value, out testDate))
{
args.IsValid = true;
CustomValidator1.ErrorMessage = "Invalid Date!";
}
}
Кажется, что он не проверяет достоверность, независимо от того, что я помещаю в текстовое поле...
Следует упомянуть об этом ASP.NET 2.0
Ответы
Ответ 1
Для того, чтобы использовать customvalidator, вам также нужен обязательный идентификатор для этого же элемента управления. Просто поставьте обязательный идентификатор для NoteDateTextBox и он должен запустить для вас событие сервера customvalidator.
Ответ 2
Когда вы тестируете пустое текстовое поле, используйте этот параметр ValidateEmptyText = "true" в CustomValidator.
В противном случае требуемая проверка поля не будет работать.
Ответ 3
Чтобы добавить к ответу Дэн, альтернативный способ использования CustomValidator
:
- Удалите свойство
ControlToValidate
- В вашем методе
OnServerValidate
используйте ссылку, которую вы проверяете, вместо использования ServerValidateEventArgs.Value
, например.
Пример
Код infront
<asp:ValidationSummary runat="server" DisplayMode="BulletList" ValidationGroup="form" />
<asp:TextBox runat="server" ID="_textbox"/>
<asp:CustomValidator runat="server"
ErrorMessage="Please enter the secret"
OnServerValidate="TextBoxValidate"
ValidationGroup="form"
Display="None"
EnableClientScript="false" />
<asp:button runat="server" OnClick="ButtonClick" Text="Press" />
Код за
protected void ButtonClick(object sender, EventArgs e)
{
Page.Validate();
if (Page.IsValid)
{
// Do something
}
}
protected void TextBoxValidate(object sender, ServerValidateEventArgs args)
{
args.IsValid = _textbox.Text == "secret";
}
Ответ 4
У меня была аналогичная проблема, для которой пустые записи не были проверены; потому что это то, что я искал.
Моим решением был атрибут: ValidateEmptyText = "true"
Ответ 5
Убедитесь, что валидатор Visible
при вызове проверки. В моем случае я установил родительский элемент управления Visible
во время DataBind
, что было слишком поздно. Валидатор унаследовал значение Visible
и всегда считался действительным.
Это, кстати, требование для любого валидатора на стороне сервера.