web-dev-qa-db-fra.com

Comment fonctionne Page.IsValid?

J'ai code suivant avec un RequiredFieldValidator. La propriété EnableClientScript est définie sur "false" dans le contrôle de validation. De plus, j'ai désactivé le script dans le navigateur.

Je n'utilise PAS Page.IsValid dans le code ci-dessous. Néanmoins, lorsque je soumets sans aucune valeur dans la zone de texte, je vais obtenir error message

D’après les commentaires de @Dai, j’ai appris que cela pouvait poser un problème si un code dans Page_Load était exécuté dans une postback. Aucune erreur de validation ne sera générée. 

(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 ne se produit-elle pas avant le Page_Load?
  2. Pourquoi ça marche bien quand j'utilise Page.IsValid?
  3. Pouvez-vous donner une référence à un article qui explique cela? (Pas quelque chose qui dit - utilisez toujours Page.IsValid; mais quelque chose qui dit quels sont les scénarios obligatoires à utiliser Page.IsValid

UPDATE 1

Référez-vous ASP.NET Validators Common Misconception

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

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

UPDATE 2

Il semble que nous devions ajouter If(Page.IsValid) dans button click également si nous utilisons un Custom Validator avec une validation côté serveur. Référez-vous CustomValidator ne fonctionne pas bien .

Remarque: la question de validation côté client est présente ici: S'il faut utiliser Page_IsValid ou Page_ClientValidate () (pour les événements côté client)

BALISAGE

<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 DERRIÈRE

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

Références:

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

La validation a lieu 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 tant qu'après (1) vous avez appelé Page.Validate ou (2) un contrôle qui entraîne la validation était la source de/inclus dans une publication.

Si vous souhaitez que la validation ait lieu avant le déclenchement des gestionnaires d’événements, vous pouvez utiliser:

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

Vous voudrez peut-être aussi envisager de revoir la conception afin de ne pas être obligé de le faire.

Dans un gestionnaire d'événements qui gère un contrôle qui entraîne la validation, il est garanti que Page.IsValid est disponible. Dans tous les autres cas, il est généralement plus sûr de demander une nouvelle validation. Un modèle de traitement des soumissions sur un formulaire comportant des validateurs:

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

Si vous utilisez une CustomValidator avec une étape de validation très coûteuse, vous pouvez envisager de mettre en cache le résultat dans le 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;
}

Cela dépend, bien entendu, à 100% de votre architecture et de la question de savoir si vous êtes en mesure ou non de présumer qu'une validation réussie/échouée lors de la validation initiale continue ou échoue lors des validations ultérieures du même cycle de vie de la page.

34
Jaime Torres

Le bouton Soumettre doit 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" />
0
Syed Nasir Abbas