2009-03-31 4 views
65

Cela n'a pas arrivé à moi avant, mais pour une raison quelconque à la fois les événements de validation côté client et serveur ne sont pas déclenché:ASP.NET personnalisé validateur côté client et serveur de validation de côté pas de tir

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

Serveur- événement de validation de côté:

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

événement de validation côté client:

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

I thoug ht au moins la validation du côté serveur se déclencherait mais non. Cela ne m'est jamais arrivé auparavant. Cela m'a vraiment bloqué.

Je regardais la sortie et ASP.NET reconnaît la fonction côté client:

ASP.NET sortie JavaScript:

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

Rendus validateur personnalisé:

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

Peut- On a fait la lumière sur les raisons pour lesquelles la validation côté client et côté serveur ne se déclencherait pas.

Edit: Je Typo 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 blanche le CustomValidator a tiré ma fonction de validation côté client très bien 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" /> 

Répondre

107

Votre CustomValidator se déclenchera uniquement lorsque le TextBox n'est pas vide. Si vous devez vous assurer que ce n'est pas vide, vous aurez besoin d'un RequiredFieldValidator aussi.

Note: If the input control is empty, no validation functions are called and validation succeeds. Use a RequiredFieldValidator control to require the user to enter data in the input control.

EDIT:

Si votre CustomValidator spécifie l'attribut ControlToValidate (et votre exemple original fait) alors vos fonctions de validation ne seront appelés lorsque le contrôle est pas vide .

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

Ceci ouvre une deuxième solution possible au problème. Plutôt que d'utiliser un RequiredFieldValidator séparé, vous pouvez omettre l'attribut ControlToValidate des CustomValidator et configurer vos fonctions de validation de faire quelque chose comme ceci:

client Code Side (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... 
    } 
} 
+2

trop rapide pour moi, je tapais même réponse :) +1 –

+2

"Votre CustomValidator se déclenchera seulement lorsque le TextBox n'est pas vide "J'ai testé cela sur une page propre et ce n'est pas vrai.La fonction de validation du client se déclenche même lorsque la zone de texte est vide –

+0

@REA_ANDREW, Pas tout à fait! Je vais mettre à jour ma réponse pour l'expliquer. – LukeH

3

Avez-vous vérifié que le contrôle provoquant le poste a de nouveau CausesValidation mis à TRU et qu'il ne dispose pas d'un groupe de validation attribué à il?

Je ne suis pas sûr quoi d'autre pourrait provoquer ce comportement.

+0

J'utilise un ImageButton pour le Soumettre, et je n'ai déclaré aucun groupe de validation. –

+0

Hazah, qui a résolu mon problème, merci :) –

0

La validation côté serveur ne se déclenchera pas si la validation côté client n'est pas valide, 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é parce que vous avez spécifié ClientValidationFunction="TextBoxDTownCityClient" et cela cherchera une fonction nommée TextBoxDTownCityClient en fonction de validation, mais le nom de la fonction doit être TextBoxDAddress1Client

(comme vous avez écrit)

+0

Twas une faute de frappe désolé que, mis à jour la question –

3

La validation côté client n'était pas exécutée du tout sur mon formulaire Web et je n'avais aucune idée pourquoi. Il s'avère que le problème était le nom de la fonction javascript était le même que l'ID de contrôle du serveur.

Vous ne pouvez pas le faire ...

<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 devine que ce conflit avec Javascript .NET interne?

2

Vérifiez également que vous n'utilisez pas des groupes de validation comme la validation wouldnt feu si la propriété ValidationGroup a été définie et non appelé explicitement via

Page.Validate({Insert validation group name here}); 
+0

Oui, mais vous avez toujours besoin de texte dans la zone de texte pour que le validateur fonctionne quand même! – Fandango68

117

Utilisez ceci:

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

Pour valider un vide champ.

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

+0

a fonctionné comme un charme - bonne solution – Sudara

+0

La solution que je cherchais. . – Mehmood

0

Merci pour cette info sur le ControlToValidate LukeH! Ce que j'essayais de faire dans mon code était de m'assurer seulement qu'un champ de texte A avait du texte dans le champ quand le champ de texte B avait une valeur particulière. Sinon, A peut être vide ou n'importe quoi d'autre. Se débarrasser de la ControlToValidate = "A" dans mon balisage a résolu le problème pour moi.

À la votre!

Questions connexes