Пользовательский валидатор asp.net не запускает текстовое поле

26

У меня есть как обязательный валидатор полей, так и пользовательский валидатор для проверки 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;
    }
  • 0
    У меня всегда есть проблемы с валидаторами на стороне сервера, я всегда заканчиваю тем, что иду на стороне клиента :(
  • 0
    Я также хотел бы знать ответ на это.
Показать ещё 6 комментариев
Теги:
validation
customvalidator

7 ответов

50

Убедитесь, что у вашего свойства 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;
} 
  • 1
    Downvote ??? Не хочешь объяснить, почему?
  • 0
    на самом деле, что-то в моем коде мешает запуску события ... у меня есть куча обязательных валидаторов полей для других текстовых полей, и это все. Они все правильно стреляют ??
Показать ещё 6 комментариев
17

Хорошо... действительно старый вопрос без принятого ответа, и я просто столкнулся с той же проблемой.

Итак, я собираюсь бросить это для всех, у кого может быть эта проблема, и нужен ответ...

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

  • 1
    Спасибо, это была причина для меня
  • 1
    Старый пост, но все равно спасибо за этот ответ. Это ответило на мои вопросы :)
8

Не забудьте установить это свойство в CustomValidator...

ValidateEmptyText="True"
2

У меня тоже была эта проблема. Да, все остальные валидаторы должны пройти до, срабатывает 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();
    }
}

Удачи!

2

В дополнение к приведенным выше предложениям я обнаружил, что с более новыми версиями .Net-структуры вы должны явно запустить метод validate() на сервере, чтобы получить обычную процедуру проверки подлинности

    // validate page before allowing import to go through
    Page.Validate();
    if (!Page.IsValid)
        return;
0

Проблема в том, что вы вызываете Response.End(), что эффективно останавливает все выполнение страницы. Таким образом, блок if/else не запускается вообще. Прокомментируйте, что линия или пропустите ее во время отладки, и валидатор будет срабатывать, как ожидалось.

Я предлагаю вам использовать отладчик вместо написания ответов таким образом или знать о последствиях Response.End(), если вы решите его использовать.

  • 0
    да, я вас слышу, но я просто пытаюсь убедиться, что обработчик получил удар, а это не так.
  • 0
    @Eric, ты пробовал комментировать эти строки Response и запускать их? Это прекрасно работает для меня, когда я так делаю.
Показать ещё 3 комментария
0

Насколько я помню, пользовательский валидатор не будет работать, если ваше текстовое поле пуст.

  • 5
    CustomValidator может CustomValidator пустой текст, если для свойства ValidateEmptyText установлено значение true как я уже указал в своем ответе. Это должно удалить его требование для RequiredFieldValidator а также.
  • 0
    +1 Келси: Вы правы, я как-то пропустил эту собственность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню