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
Page_Load
?Page.IsValid
?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éthodePage.Validate()
qui est appelée implicitement quelque part aprèsPage_Load
. Si vous conservez toute votre logique dans un gestionnaire d'événements Page_Load (ce qui est vivement déconseillé!), Appelez laPage.Validate()
avant de vérifier lePage.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:
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.
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" />