web-dev-qa-db-fra.com

le validateur personnalisé asp.net ne se déclenche pas pour la zone de texte

J'ai à la fois un validateur de champ requis et un validateur personnalisé pour valider une texbox. Le validateur de champ requis se déclenche parfaitement. Je ne parviens pas à faire valider le validateur personnalisé?

<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!" />

code derrière

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;
    }
28
Eric Savard

Vérifiez que votre propriété CustomValidatorValidateEmptyText est définie sur true afin que le texte vide soit validé. Dans ce cas, vous n’avez plus besoin de la variable RequiredFieldValidator.

EDIT: J'ai pris votre code et copié et collé dans un projet vide et cela fonctionne comme prévu. Il doit y avoir quelque chose que vous n'avez pas posté, ou que vous avez posté de manière incorrecte, dont nous ne sommes pas au courant. Y a-t-il autre chose qui affecte le bouton qui déclenche la validation ou les contrôles de validation eux-mêmes?

EDIT: Voici le code exact (c'est dans une page de contenu):

page 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>

Page .cs (Page_Load vide):

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;
} 
49
Kelsey

Ok ... vraiment vieille question sans réponse acceptée pour le moment, et je viens de rencontrer le même problème.

Donc, je vais lancer ceci pour tous ceux qui pourraient avoir ce problème et qui ont besoin d'une réponse ... 

Si vous effectuez des validations régulières, ainsi que des validations de serveur personnalisées, la validation de serveur personnalisé ne sera déclenchée que si toutes les autres validations sont renvoyées propres, du moins, c'est ainsi que cela a fonctionné pour moi.

18
Patrick

N'oubliez pas de définir cette propriété sur le CustomValidator ...

ValidateEmptyText="True"
9
Remotec

En plus des suggestions ci-dessus, j'ai constaté qu'avec les versions plus récentes du framework .Net, vous devez explicitement activer la méthode validate () sur le serveur pour obtenir la routine de validation personnalisée.

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

J'ai eu ce problème également. Oui, tous les autres validateurs doivent réussir avant le CustomValidator est déclenché.

Toutefois, si cela ne fonctionne pas pour vous, vous devrez peut-être forcer la validation de votre groupe de validation spécifique à l'aide de la fonction Page.Validate().

Voici comment je l’ai fait, et j’ai quand même réussi à conserver ma RequiredFieldValidator et aucun besoin de ValidateEmptyText="true".

Ajouter un piège dans la zone de texte pour forcer une validation.

<asp:TextBox ID="txtLeft" runat="server" Width="110px" TextMode="SingleLine" style="text-align:center" OnTextChanged="TextBoxChanged_DateTimeTest" AutoPostBack="True" ValidationGroup="vg2"></asp:TextBox>

Notez que j’utilise une ValidationGroup "vg2" spécifique, car j’ai d’autres domaines que je ne veux pas valider.

De plus, je veux valider la date et l'heure !

Vous avez besoin de deux autres choses. La méthode 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();
        }
    }

Et vous avez également besoin de la validation côté serveur pour la variable CustomValidator. Dans mon cas, la TextBox doit accepter une date et une heure!

Alors, voici le balisage ...

<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>

Et voici le code derrière ...

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();
    }
}

Bonne chance!

3
Fandango68

Le problème est que vous appelez Response.End() qui arrête effectivement toute exécution de la page. Ainsi, le bloc if/else n'est pas exécuté du tout. Commentez cette ligne ou ignorez-la pendant le débogage et le validateur se déclenchera comme prévu.

Je vous suggère d'utiliser un débogueur au lieu d'écrire les réponses de cette manière ou de prendre conscience des conséquences de Response.End() si vous choisissez de l'utiliser.

1
Ahmad Mageed

Autant que je m'en souvienne, le validateur personnalisé ne se déclenchera pas si votre zone de texte est vide.

1
Andrey