У меня есть как обязательный валидатор полей, так и пользовательский валидатор для проверки texbox. Необходимый полевой валидатор срабатывает отлично. Я не могу правильно настроить специальный валидатор?
<asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />
<asp:RequiredFieldValidator display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />
<asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" errormessage="The text must be exactly 8 characters long!" />
код за
protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
{
Response.Write("firing - test");
Response.End();
if (e.Value.Length == 8)
e.IsValid = true;
else
e.IsValid = false;
}
Убедитесь, что у вашего свойства CustomValidator
ValidateEmptyText
установлено значение true
, чтобы пустой текст был проверен. Тогда вам больше не понадобится RequiredFieldValidator
.
РЕДАКТИРОВАТЬ: Я взял ваш код и скопировал его и вложил в пустой проект, и он работает так, как ожидалось. Должно быть что-то, что вы не опубликовали, или публикуете неправильно, о чем мы не знаем. Есть ли что-то еще, что влияет на кнопку, которая запускает проверку или сами элементы управления проверкой?
EDIT: Вот точный код (он находится на странице контента):
Страница aspx:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />
<asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" errormessage="The text must be exactly 8 characters long!" />
</asp:Content>
.cs(пусто Page_Load
):
protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
{
// put a break point here and it stops on it
if (e.Value.Length == 8)
e.IsValid = true;
else
e.IsValid = false;
}
Хорошо... действительно старый вопрос без принятого ответа, и я просто столкнулся с той же проблемой.
Итак, я собираюсь бросить это для всех, у кого может быть эта проблема, и нужен ответ...
Если вы выполняете регулярные проверки, а также пользовательские проверки валидации, то проверка пользовательского сервера будет срабатывать только в том случае, если все остальные проверки вернутся, по крайней мере, к тому, как это работает для меня.
Не забудьте установить это свойство в CustomValidator...
ValidateEmptyText="True"
У меня тоже была эта проблема. Да, все остальные валидаторы должны пройти до, срабатывает CustomValidator
.
Однако, если это не работает для вас, вам может потребоваться принудительное подтверждение вашей конкретной группы проверки с помощью Page.Validate()
.
Вот как я это сделал, и мне все еще удалось сохранить RequiredFieldValidator
и не нужно ValidateEmptyText="true"
.
Добавьте ловушку в текстовое поле, чтобы принудительно подтвердить.
<asp:TextBox ID="txtLeft" runat="server" Width="110px" TextMode="SingleLine" style="text-align:center" OnTextChanged="TextBoxChanged_DateTimeTest" AutoPostBack="True" ValidationGroup="vg2"></asp:TextBox>
Обратите внимание, что я использую конкретный ValidationGroup
"vg2", так как у меня есть другие области, которые я не хочу проверять.
Кроме того, я хочу подтвердить дату & время
Вам нужно еще две вещи. Метод TextBoxChanged_DateTimeTest
...
protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
{
Page.Validate("vg2");
if (!Page.IsValid)
{
TextBox tb1 = (TextBox)sender;
IFormatProvider culture = new CultureInfo("en-AU", true);
//if page is not valid, then validate the date here and default it to today date & time,
String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
DateTime dt1;
DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
if (dt1.ToShortDateString() != "1/01/0001")
tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
else
tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
}
}
И вам также нужна проверка на стороне сервера для CustomValidator
. В моем случае TextBox должен принимать дату и время!
Итак, здесь разметка...
<asp:CustomValidator ID="CustomValidator3" runat="server" ControlToValidate="txtLeft" ErrorMessage="Invalid date & time format (dd/MM/yyyy HH:mm)"
SetFocusOnError="true" ValidationGroup="vg2" OnServerValidate="CustomValidator_DateTime"></asp:CustomValidator>
А вот код позади...
protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
{
Page.Validate("vg2");
if (!Page.IsValid)
{
TextBox tb1 = (TextBox)sender;
IFormatProvider culture = new CultureInfo("en-AU", true);
//if page is not valid, then validate the date here and default it to today date & time,
String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
DateTime dt1;
DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
if (dt1.ToShortDateString() != "1/01/0001")
tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
else
tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
}
}
Удачи!
В дополнение к приведенным выше предложениям я обнаружил, что с более новыми версиями .Net-структуры вы должны явно запустить метод validate() на сервере, чтобы получить обычную процедуру проверки подлинности
// validate page before allowing import to go through
Page.Validate();
if (!Page.IsValid)
return;
Проблема в том, что вы вызываете Response.End()
, что эффективно останавливает все выполнение страницы. Таким образом, блок if/else не запускается вообще. Прокомментируйте, что линия или пропустите ее во время отладки, и валидатор будет срабатывать, как ожидалось.
Я предлагаю вам использовать отладчик вместо написания ответов таким образом или знать о последствиях Response.End()
, если вы решите его использовать.
Response
и запускать их? Это прекрасно работает для меня, когда я так делаю.
Насколько я помню, пользовательский валидатор не будет работать, если ваше текстовое поле пуст.
CustomValidator
может CustomValidator
пустой текст, если для свойства ValidateEmptyText
установлено значение true
как я уже указал в своем ответе. Это должно удалить его требование для RequiredFieldValidator
а также.