39 votes

Comment fonctionne Page.IsValid ?

J'ai le code suivant avec un RequiredFieldValidator . Le site EnableClientScript est définie comme "false" dans le contrôle de validation. J'ai également désactivé script dans le navigateur.

Je n'utilise PAS Page.IsValid dans le code derrière. Pourtant, lorsque je soumets sans aucune valeur dans la zone de texte, j'obtiens error message .

D'après les commentaires de @Dai, j'ai appris que cela peut être un problème, s'il y a un code dans le fichier Page_Load qui est exécuté dans un postback . Il n'y aura pas d'erreur de validation.

(Cependant, pour le gestionnaire de clic de bouton, il n'est pas nécessaire de vérifier Page.IsValid )

if (Page.IsPostBack)
{
    string value = txtEmpName.Text;
    txtEmpName.Text = value + "Appended";
}

QUESTION

  1. Pourquoi la validation côté serveur n'intervient-elle pas avant Page_Load ?
  2. Pourquoi cela fonctionne-t-il bien lorsque j'utilise Page.IsValid ?
  3. Pouvez-vous fournir la référence d'un article qui explique cela ? (Pas quelque chose qui dit - toujours utiliser Page.IsValid mais quelque chose qui dit quels sont les scénarios obligatoires à utiliser. Page.IsValid

MISE À JOUR 1

Consultez le site Idées fausses sur les validateurs ASP.NET

Page.IsValid est accessible uniquement après avoir exécuté Page.Validate() qui est invoquée implicitement quelque part après la méthode Page_Load . Si vous conservez toute votre logique dans un gestionnaire d'événement Page_Load (ce qui est fortement déconseillé !), appelez la fonction Page.Validate() avant de vérifier le Page.IsValid .

Note : Il est conseillé de ne pas garder toute la logique dans Page_Load . Si quelque chose doit se produire sur l'événement de clic du bouton, déplacez-le vers le gestionnaire d'événement de clic du bouton. Si quelque chose doit se produire lors de l'événement de changement d'élément sélectionné de la liste déroulante, déplacez-le vers le gestionnaire d'événements de changement d'élément sélectionné de la liste déroulante.

MISE À JOUR 2

Il semble que, nous devons ajouter If(Page.IsValid) sur button click également si nous utilisons un Custom Validator avec une validation côté serveur. Voir CustomValidator ne fonctionne pas bien .

Note : La question de la validation côté client est présente ici : Utilisation de Page_IsValid ou Page_ClientValidate() (pour les événements côté client)

MARKUP

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
    alert('haiii');
</script>

</head>
<body>
<form id="form1" runat="server">
<div>
    <asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" />
    <asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName"
        EnableClientScript="false" ErrorMessage="RequiredFieldValidator" Text="*" Display="Dynamic"
        ValidationGroup="ButtonClick"></asp:RequiredFieldValidator>
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" />
</div>
</form>
</body>
</html>

CODE BEHIND

protected void Button1_Click(object sender, EventArgs e)
{
    string value = txtEmpName.Text;
    SubmitEmployee(value);
}

Références :

  1. Dois-je toujours appeler Page.IsValid ?
  2. Contrôles de validation ASP.NET - Points importants, conseils et astuces
  3. CustomValidator ne fonctionne pas bien

2 votes

0 votes

@MassimilianoPeluso Cette question est similaire mais ne traite pas du même problème. Il est dit "appeler Page.IsValid même si aucun contrôle de validation n'est présent sur la page". Mais j'ai des contrôles de validation dans ma page

1 votes

Vous devez nous montrer votre logique de code. Selon la façon dont vous avez écrit votre code, il peut être nécessaire ou non de vérifier IsValid . Par exemple, si votre logique se trouve dans un gestionnaire de clics sur un bouton qui n'est invoqué que si la page est valide, alors l'option IsValid est effectuée en coulisses, mais si votre logique est en cours d'exécution, il est possible d'effectuer des vérifications. Page_Load gardé par if( IsPostback ); Validate(); if( IsValid ) alors vous devez vraiment vérifier la propriété.

38voto

Jaime Torres Points 5955

La validation intervient après Page_Load mais avant les gestionnaires d'événements (voir http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx ).

Si votre bouton ne provoque pas de validation, vous devez déclencher manuellement Page.Validate.

Vous ne pouvez pas interroger Page.IsValid jusqu'à ce que (1) vous ayez appelé Page.Validate ou (2) un contrôle qui provoque une validation a été la source d'un postback ou a été inclus dans un postback.

Si vous souhaitez que la validation ait lieu avant que les gestionnaires d'événements ne se déclenchent, vous pouvez utiliser :

if (Page.IsPostback) 
{
   Page.Validate( /*Control Validation Group Name Optional*/ );
   if (Page.IsValid)
   {
       //Do some cool stuff
   }
}

Vous pouvez également envisager de procéder à un réaménagement pour ne pas être obligé de le faire.

Dans un gestionnaire d'événement qui gère un contrôle qui provoque une validation, Page.IsValid est garanti comme étant disponible. Dans tous les autres cas, il est généralement plus sûr de demander à nouveau la validation. Un modèle pour traiter les soumissions sur un formulaire qui a des validateurs :

void btnSubmit_Click(object sender, EventArgs e)
{
   this.UpdateGUIWithSubmitRequest();
   if (Page.IsValid)
   {
      this.ProcessSuccessfulSubmission();
   }
   else
   {
      this.ProcessInvalidSubmission();
   }
}

Si vous utilisez un CustomValidator dont l'étape de validation est très coûteuse, vous pouvez envisager de mettre le résultat en cache dans le fichier HttpResponse.Cache afin de ne pas avoir à valider à nouveau si plusieurs appels à Page.Validate se produisent.

void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
   CustomValidator self = (CustomValidator)source;
   string validatorResultKey = self.ClientID;
   bool? validatorResult = Context.Items[validatorResultKey] as bool?;
   if (validatorResult.HasValue)
   {
      args.IsValid = validatorResult.Value;
      return;
   }

   bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
   Context.Items[validatorResultKey] = isValid;
   args.IsValid = isValid;
}

Bien entendu, cela dépend à 100 % de votre architecture et du fait que vous puissiez ou non partir du principe qu'une validation réussie/échec lors de la validation initiale est toujours réussie/échec lors des validations suivantes du même cycle de vie de la page.

0 votes

Voulez-vous dire CausesValidation="false" quand vous dites "Si votre bouton ne provoque pas de validation" ?

1 votes

Oui, mais il y a une mise en garde. Si CausesValidation est false mais UseSubmitBehavior est true je suis certain qu'il y a encore des validations. Je n'arrive pas à trouver de bonnes références à ce sujet pour le moment, mais je crois avoir déjà rencontré une telle situation. Peut-être que quelqu'un de l'OS peut dire si c'est vraiment le cas ou non.

0 votes

Vous devez seulement vérifier Page.IsValid si vous ne voulez effectuer une action que sur une page valide. Il existe des cas d'utilisation très réels où vous pouvez vouloir faire quelque chose à 100 % lors d'un clic, et autre chose si tous les validateurs sont passés. Je vais développer un peu ma réponse, juste pour le plaisir.

1voto

Syed Nasir Abbas Points 401

Le bouton d'envoi devrait avoir le même groupe de validation que le contrôle du validateur. Par exemple

 <asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X