Пользовательский валидатор asp.net не запускает текстовое поле - PullRequest
28 голосов
/ 25 февраля 2011

У меня есть и обязательный валидатор полей, и пользовательский валидатор для проверки 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;
    }

Ответы [ 8 ]

49 голосов
/ 25 февраля 2011

Убедитесь, что для вашего свойства CustomValidator ValidateEmptyText установлено значение true, чтобы пустой текст был проверен. Тогда вам больше не понадобится RequiredFieldValidator.

РЕДАКТИРОВАТЬ: Я взял ваш код и скопировал и вставил его в пустой проект, и он работает, как ожидалось. Должно быть, что-то, что вы не опубликовали или публикуете неправильно, о чем мы не знаем. Есть ли что-то еще, что влияет на кнопку, которая запускает проверку, или сами элементы управления проверкой?

РЕДАКТИРОВАТЬ: Вот точный код (он находится на странице содержимого):

Страница 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;
} 
18 голосов
/ 02 марта 2012

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

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

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

9 голосов
/ 17 июля 2013

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

ValidateEmptyText="True"
4 голосов
/ 22 апреля 2013

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

    // validate page before allowing import to go through
    Page.Validate();
    if (!Page.IsValid)
        return;
3 голосов
/ 18 февраля 2016

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

Удачи!

1 голос
/ 25 февраля 2011

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

1 голос
/ 25 февраля 2011

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

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

0 голосов
/ 14 июля 2019

, если в вашем коде есть несколько частей, и у каждой части есть свой валидатор, создайте validateGroup для каждой части

...