Développement d'un contrôle validateur
Cette section traite de la validation dans l'infrastructure de page ASP.NET et montre comment vous pouvez développer votre propre bibliothèque de contrôles validateurs.
La validation implique généralement la vérification des données de formulaire entrées par l'utilisateur. Cependant, elle peut aussi impliquer d'autres types de contrôle d'erreur. Pour fournir une abstraction qui englobe différents scénarios impliquant la validation, le .NET Framework définit l'interface System.Web.UI.IValidator, qui possède les membres ci-dessous.
public interface IValidator
{
void Validate();
string ErrorMessage {get; set;}
bool IsValid {get; set;}
}
[Visual Basic]
Public Interface IValidator
Sub Validate()
Property ErrorMessage As String
Property IsValid As Boolean
End Interface
La méthode Validate exécute une logique de contrôle d'erreur et définit la propriété IsValid. La propriété ErrorMessage contient une chaîne d'erreur fournie par un développeur de pages.
La classe Page expose la propriété Validators, qui est une liste de tous les types IValidator sur la page. Toute classe qui implémente l'interface IValidator est considérée comme étant un validateur et peut être ajoutée à la propriété Validators de sa page conteneur. Une page assure le suivi de l'état d'erreur de ses validateurs et met à jour son propre état d'erreur global en conséquence.
Les types de validateurs les plus communs sont les contrôles validateurs qui rendent l'interface utilisateur sur le client afin de signaler les erreurs d'entrée. Pour plus d'informations sur les contrôles validateurs fournis avec le Kit de développement .NET Framework SDK, consultez Démarrage rapide ASP.NET —> Web Forms ASP.NET —> Validation de formulaire par le biais de contrôles serveur. La liste suivante, qui récapitule les caractéristiques des contrôles validateurs dans le .NET Framework, devrait être utile à ceux qui créent une bibliothèque de contrôles validateurs :
- Les contrôles validateurs sont distincts des contrôles qu'ils valident. (Pour participer à la validation, un contrôle serveur doit exposer une propriété à valider en la marquant avec ValidationPropertyAttribute.)
- Plusieurs contrôles validateurs peuvent être associés au même contrôle d'entrée.
- L'apparence et le message d'erreur d'un contrôle validateur sont personnalisables par le développeur de pages.
- Les contrôles validateurs sont activés pour les scripts et exécutent le même contrôle d'erreur sur les clients (de niveau supérieur) que sur le serveur.
- Sur les clients de niveau supérieur, les contrôles validateurs affichent les erreurs d'entrée sans un aller-retour au serveur. Des erreurs de validation par champ sont affichées sur le client dès que l'utilisateur effectue une tabulation pour atteindre un autre champ, alors que les erreurs de validation de champ obligatoire et le résumé des erreurs sont affichés lorsque l'utilisateur envoie le formulaire.
- Les développeurs de pages peuvent fournir un script côté client qui complète ou remplace la vérification des erreurs côté client effectuée par un contrôle validateur.
La fonctionnalité de validation commune est implémentée par la classe de base abstraite System.Web.UI.WebControls.BaseValidator, qui implémente IValidator, inscrit le script côté client auprès de la page et fournit une logique de rendu de base. Les classes de validateur concrètes telles que RequiredFieldValidator, RegularExpressionValidator et CustomValidator dérivent de BaseValidator et ajoutent leur propre fonctionnalité spécifique. Un résumé des messages d'erreur de validation est fourni par le contrôle ValidationSummary. ValidationSummary lui-même n'est pas un validateur (il n'implémente pas IValidator) et dérive de WebControl. ValidationSummary accède à la collection Validators d'une page pour obtenir le message d'erreur de chaque validateur inscrit auprès de la page.
Si vous avez installé le Kit de développement .NET Framework SDK ou Visual Studio .NET, vous pouvez voir la bibliothèque de scripts qui est émise par BaseValidator en examinant le fichier dans le répertoire racine virtuel aspnet_client/system_web/<version of SDK installed>. Pour plus d'informations sur l'émission d'un script côté client, consultez Fonctionnalités côté client dans un contrôle serveur.
La section suivante décrit les étapes clés du développement d'un contrôle validateur qui fournit une fonctionnalité de validation de base. Suivez ces étapes si vous voulez développer un contrôle validateur de base pour une bibliothèque de validateurs personnalisés ou un contrôle validateur personnalisé qui fournit toutes les fonctionnalités de validation nécessaires. Vous n'êtes pas tenu d'implémenter ces étapes si vous êtes seulement intéressé par un scénario plus simple tel que l'extension d'un validateur existant. Pour ce type de cas, consultez les exemples qui étendent un validateur de base dans Exemples de contrôle validateur.
Pour implémenter un validateur
Remarque Les étapes 1 à 4 de la liste suivante sont communes à tous les validateurs, y compris les classes de validateurs côté serveur qui ne sont pas des contrôles. Les étapes 5 à 10 s'appliquent aux contrôles qui fournissent une interface utilisateur et émettent un script côté client.
Définissez une classe qui implémente IValidator. Si le validateur est un contrôle, il doit en plus dériver directement ou indirectement de Control. Dans le .NET Framework, les contrôles validateurs dérivent de System.Web.UI.WebControls.Label, comme le montre l'exemple suivant.
public abstract class BaseDomValidator : Label, IValidator {...} [Visual Basic] MustInherit Public Class BaseDomValidator Inherits Label Implements IValidator ... End Class
Remarque Sauf s'il est destiné à servir de classe de base, votre validateur ne doit pas nécessairement être de type abstrait.
Implémentez le contrat de IValidator. L'exemple suivant montre comment implémenter IValidator. Consultez également Contrôle validateur de base, exemple.
public string ErrorMessage { get { object o = ViewState["ErrorMessage"]; return((o == null) ? String.Empty : (string)o); } set { ViewState["ErrorMessage"] = value; } } public bool IsValid { get { return isValid; } set { isValid = value; } } public void Validate() { ... // A base validator cannot supply all the validating logic. // You can implement common functionality here and invoke an // abstract method that is overridden by derived classes to // provide validation logic. IsValid = EvaluateIsValid(); } // This method is overridden by a concrete class that extends // the base validator to supply specific validation logic. protected abstract bool EvaluateIsValid(); [Visual Basic] Public Property ErrorMessage() As String Implements IValidator.ErrorMessage Get Dim o As Object = ViewState("ErrorMessage") If o Is Nothing Then Return String.Empty Else Return CStr(o) End If End Get Set ViewState("ErrorMessage") = value End Set End Property Public Property IsValid() As Boolean Implements IValidator.IsValid Get Return _isValid End Get Set _isValid = value End Set End Property Public Sub Validate() Implements IValidator.Validate ... ' A base validator cannot supply all the validating logic. ' You can implement common functionality here and invoke an ' abstract method that is overridden by derived classes to ' provide validation logic. IsValid = EvaluateIsValid() End Sub ' This method is overridden by a concrete class that extends ' the base validator to supply specific validation logic. Protected MustOverride Function EvaluateIsValid() As Boolean
Ajoutez le validateur à la propriété Validators de sa page conteneur lorsque la page est initialisée, en substituant la méthode OnInit de la façon suivante.
protected override void OnInit(EventArgs e) { base.OnInit(e); Page.Validators.Add(this); } [Visual Basic] Protected Overrides Sub OnInit(e As EventArgs) MyBase.OnInit(e) Page.Validators.Add(Me) End Sub
Remarque Si votre validateur n'est pas un contrôle, cette étape doit être exécutée par le développeur de pages dans la méthode Page_Load.
Supprimez le validateur dans la propriété Validators de sa page conteneur lorsque la page est déchargée, en substituant la méthode OnUnload de la façon suivante.
protected override void OnUnload(EventArgs e) { if (Page != null) { Page.Validators.Remove(this); } base.OnUnload(e); } [Visual Basic] Protected Overrides Sub OnUnload(e As EventArgs) If Not (Page Is Nothing) Then Page.Validators.Remove(Me) End If MyBase.OnUnload(e) End Sub
Remarque Si votre validateur n'est pas un contrôle, cette étape doit être exécutée par le développeur de pages dans la méthode Page_Unload.
Définissez une propriété qui permet à un utilisateur d'associer un contrôle d'entrée à valider à l'aide du validateur. Dans les contrôles validateurs ASP.NET, cette propriété est nommée ControlToValidate ; elle est définie comme indiqué dans l'exemple de contrôle validateur de base.
Définissez une propriété qui permet à un utilisateur de déterminer si le contrôle doit émettre un script côté client. Dans les contrôles validateurs ASP.NET, cette propriété est nommée EnableClientScript ; elle est définie comme indiqué dans l'exemple de contrôle validateur de base.
Préparez la bibliothèque de scripts côté client à packager à l'aide de votre contrôle validateur et placez-la dans le répertoire approprié sur le serveur de façon à ce qu'elle puisse être utilisée par d'autres applications sans créer de conflits de versioning. Pour plus d'informations, consultez Fonctionnalités côté client dans un contrôle serveur. Pour obtenir un exemple de bibliothèque de scripts, consultez Bibliothèque de scripts pour validateur, exemple.
Appelez les méthodes de Page qui émettent un script côté client. Pour plus d'informations, consultez la description fournie dans Fonctionnalités côté client dans un contrôle serveur et l'implémentation dans l'exemple de contrôle validateur de base. Ces méthodes d'écriture de scripts sont appelées à partir des méthodes PreRender et Render.
Implémentez la logique de rendu en substituant les méthodes AddAttributestoRender et Render. Pour obtenir un exemple, consultez l'implémentation dans l'exemple de contrôle validateur de base.
Toutes les étapes montrées ici sont implémentées dans l'exemple de contrôle validateur de base.
Voir aussi
Exemples de contrôle validateur | Fonctionnalités côté client dans un contrôle serveur