web-dev-qa-db-fra.com

Validateur personnalisé ASP.NET La validation côté client et côté serveur ne se déclenche pas

Cela ne m'est pas arrivé auparavant, mais pour une raison quelconque, les événements de validation côté client et côté serveur ne sont pas déclenchés:

<asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" />
<asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true"
    ErrorMessage="Delivery Town or City required"
    ClientValidationFunction="TextBoxDTownCityClient" 
    ControlToValidate="TextBoxDTownCity"
    OnServerValidate="TextBoxDTownCity_Validate" Display="Dynamic" >
</asp:CustomValidator>

Evénement de validation côté serveur:

protected void TextBoxDTownCity_Validate(object source, ServerValidateEventArgs args)
{
    args.IsValid = false;
}

Evénement de validation côté client:

function TextBoxDCountyClient(sender, args) {
    args.IsValid = false;
    alert("test");
}

Je pensais au moins que la validation côté serveur se déclencherait, mais non. cela ne m'est jamais arrivé auparavant. Cela m'a vraiment stumped.

J'ai regardé la sortie et ASP.NET reconnaît la fonction côté client:

Sortie JavaScript ASP.NET:

var ctl00_ctl00_content_content_CustomValidator2 = document.all ? document.all["ctl00_ctl00_content_content_CustomValidator2"] : document.getElementById("ctl00_ctl00_content_content_CustomValidator2");

ctl00_ctl00_content_content_CustomValidator2.controltovalidate = "ctl00_ctl00_content_content_TextBoxDTownCity";

ctl00_ctl00_content_content_CustomValidator2.errormessage = "Delivery Town or City required";

ctl00_ctl00_content_content_CustomValidator2.display = "Dynamic";

ctl00_ctl00_content_content_CustomValidator2.evaluationfunction = "CustomValidatorEvaluateIsValid";

ctl00_ctl00_content_content_CustomValidator2.clientvalidationfunction = "TextBoxDTownCityClient";

Validateur personnalisé rendu:

<span id="ctl00_ctl00_content_content_CustomValidator2" style="color:Red;display:none;">Delivery Town or City required</span> 

Quelqu'un peut-il nous expliquer pourquoi la validation côté client et côté serveur ne serait pas lancée?.

Edit: Typo j'ai collé dans la mauvaise fonction, problème toujours le même

Juste une autre mise à jour du dernier commentaire: où par la zone de texte ne peut pas être vide. J'ai testé cela et ce n'est pas vrai. Sur une page vierge, CustomValidator a activé la fonction de validation côté client sans valeur:

<asp:TextBox ID="TextBox1" runat="server" />
<asp:CustomValidator ID="CustomValidator1" runat="server" 
ErrorMessage="CustomValidator" ClientValidationFunction="TextBoxDAddress1Client"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
67
REA_ANDREW

Votre CustomValidator ne se déclenche que lorsque la TextBox n'est pas vide.

Si vous devez vous assurer que ce n'est pas vide, vous aurez aussi besoin d'un RequiredFieldValidator .

Remarque: Si le contrôle d'entrée est vide, aucune fonction de validation n'est appelée et la validation réussit. Utiliser un RequiredFieldValidator control to obliger l'utilisateur à saisir des données dans le fichier contrôle d'entrée.

MODIFIER:

Si votre CustomValidator spécifie l'attribut ControlToValidate (et votre exemple d'origine le fait), vos fonctions de validation ne seront appelées que lorsque le contrôle n'est pas vide.

Si vous ne spécifiez pas ControlToValidate, vos fonctions de validation seront appelées à chaque fois.

Cela ouvre une seconde solution possible au problème. Plutôt que d'utiliser une variable RequiredFieldValidator distincte, vous pouvez omettre l'attribut ControlToValidate de la variable CustomValidator et configurer vos fonctions de validation de manière à:

Code côté client (Javascript):

function TextBoxDCountyClient(sender, args) {
    var v = document.getElementById('<%=TextBoxDTownCity.ClientID%>').value;
    if (v == '') {
        args.IsValid = false;  // field is empty
    }
    else {
        // do your other validation tests here...
    }
}

Code côté serveur (C #):

protected void TextBoxDTownCity_Validate(
    object source, ServerValidateEventArgs args)
{
    string v = TextBoxDTownCity.Text;
    if (v == string.Empty)
    {
        args.IsValid = false;  // field is empty
    }
    else
    {
        // do your other validation tests here...
    }
}
109
LukeH

Utilisez ceci:

<asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/>

Pour valider un champ vide.

Vous n'avez pas besoin d'ajouter 2 validateurs!

121
Carl Nielsen

La validation côté client n'était pas exécutée du tout sur mon formulaire Web et je ne savais pas pourquoi. Il se trouve que le problème était que le nom de la fonction javascript était identique à l'ID de contrôle du serveur. 

Donc tu ne peux pas faire ça ...

<script>
  function vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="vld" />

Mais cela fonctionne:

<script>
  function validate_vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="validate_vld" />

Je suppose que cela est en conflit avec le Javascript interne .NET?

4
Bill Gates

Avez-vous vérifié que CausesValidation du contrôle à l'origine de la publication est défini sur tru et qu'aucun groupe de validation ne lui est attribué?

Je ne sais pas quoi d'autre pourrait causer ce comportement.

3
Daniel

Vérifiez également que vous n'utilisez pas de groupes de validation, car cette validation ne serait pas déclenchée si la propriété validationgroup était définie et non explicitement appelée via

 Page.Validate({Insert validation group name here});
2
ori

Merci pour cette information sur le ControlToValidate LukeH!

Ce que j'essayais de faire dans mon code était de m'assurer uniquement que certains champs de texte A contenaient du texte lorsque le champ de texte B avait une valeur particulière. Sinon, A peut être vide ou autre chose. Se débarrasser de ControlToValidate = "A" dans mon balisage a résolu le problème pour moi.

À votre santé!

0
doddy

La validation côté serveur ne se déclenche pas si la validation côté client est invalide, la publication n'est pas envoyée.

N'avez-vous pas une autre validation qui ne passe pas?

La validation côté client n'est pas exécutée parce que vous avez spécifié ClientValidationFunction="TextBoxDTownCityClient" et que cela recherchera une fonction nommée TextBoxDTownCityClient comme fonction de validation, mais le nom de la fonction doit être TextBoxDAddress1Client

(comme vous l'avez écrit)

0
Davide Vosti