Comment : personnaliser la validation des champs de données dans le modèle de données
Mise à jour : Juillet 2008
Dynamic Data ASP.NET vous permet de personnaliser et d'étendre la validation des données au modèle de données. Cette rubrique vous indique comment ajouter la validation des champs de données dans le modèle de données en procédant comme suit :
Personnalisation de la validation des champs de données individuels en appliquant des attributs Dynamic Data System.ComponentModel.DataAnnotations aux champs. Ces attributs définissent des modèles de validation communs, tels que le contrôle de plage et les champs obligatoires. Cette approche vous permet d'utiliser des contrôles de validation prédéfinis avec très peu de codage. Vous devez utiliser cette approche lorsque vous souhaitez appliquer une validation supplémentaire à celle déjà fournie par Dynamic Data, et que les attributs System.ComponentModel.DataAnnotations par défaut répondent à vos exigences.
Remarque : Il est également possible de créer vos propres attributs de validation personnalisés. Cela vous permet d'étendre la validation fournie par les attributs System.ComponentModel.DataAnnotations. Cela s'avère utile si les attributs disponibles ne satisfont pas aux exigences de validation d'un champ de données spécifique. Pour plus d'informations, consultez Comment : personnaliser la validation des champs de données dans le modèle de données à l'aide d'attributs personnalisés.
Personnalisation de la validation d'un champ de données individuel en substituant la méthode de classe partielle qui traite des modifications pour ce champ de données (ou en gérant un événement correspondant). Cette approche vous permet d'ajouter une validation et une logique métier pour un champ individuel.
Personnalisation de la validation des champs de données en substituant la méthode OnValidate (ou en gérant l'événement Validate ). Cette méthode est appelée lors du traitement des champs de données de la table. Cette approche est plus générale que l'ajout d'une validation pour un champ individuel. Cela s'avère utile lorsque la même logique de validation peut être appliquée à plusieurs champs de données, et vous permet par ailleurs d'effectuer des contrôles de validation qui impliquent plusieurs champs.
Les exceptions de validation qui sont levées dans le modèle de données sont interceptées par le contrôle DynamicValidator. Si une page contient un contrôle DynamicValidator, l'erreur peut être affichée dans la page.
- Pour tous les contrôles de validation que vous ajoutez au modèle de données, vous devez créer une classe partielle qui étend la classe de table dans le modèle de données. Vous ajoutez ensuite les contrôles de validation à la classe partielle.
Exécutez un exemple en ligne de cette fonctionnalité.
Création d'une classe partielle pour la validation
Pour pouvoir personnaliser la validation au niveau de la couche du modèle de données, vous devez implémenter une classe partielle qui étend le modèle de données. Cela vous permet d'effectuer les opérations suivantes :
Personnaliser la validation en ajoutant des informations de métadonnées via les attributs.
Personnaliser la validation en implémentant des méthodes de classe partielle qui vous permettent de créer votre propre logique de validation.
Pour créer une classe partielle pour la validation
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le dossier App_Code, puis cliquez sur Ajouter un nouvel élément.
Sous Modèles Visual Studio installés, cliquez sur Classe.
Dans la zone Nom, entrez le nom de la table de données pour laquelle vous souhaitez ajouter la validation.
Le nom de classe doit correspondre au nom de classe d'entité qui représente la table. Par exemple, si vous souhaitez ajouter la validation pour la table Customers, vous devez nommer le fichier Customer.cs dans Visual C# ou Customer.vb dans Visual Basic, puis nommer la classe Customer.
Ajoutez le mot clé Partial dans Visual Basic ou le mot clé partial dans Visual C# à la définition de classe pour en faire une classe partielle.
L'exemple suivant montre la déclaration de classe mise à jour.
public partial class Customer { }
Partial Public Class Customer End Class
Si vous créez la classe dans Visual C#, supprimez le constructeur par défaut.
Ajoutez des références aux espaces de noms System.Web.DynamicData et System.ComponentModel.DataAnnotations à l'aide du mot clé Imports dans Visual Basic ou du mot clé using dans Visual C#, comme le montre l'exemple suivant :
using System.Web.DynamicData; using System.ComponentModel.DataAnnotations;
Imports System.Web.DynamicData Imports System.ComponentModel.DataAnnotations
Dans le même fichier, créez une deuxième classe qui servira de classe de métadonnées associée. Vous pouvez lui donner n'importe quel nom du moment que celui-ci est valide et qu'il n'est pas déjà utilisé.
L'exemple suivant montre une déclaration de classe de métadonnée.
[C#]
public class CustomerMetadata { }
Public Class CustomerMetadata End Class
La classe de métadonnées associée fournit un objet auquel vous pouvez appliquer des attributs de validation.
Appliquez l'attribut MetadataTypeAttribute à la définition de classe partielle. Pour le paramètre de l'attribut, utilisez le nom de la classe de métadonnées associée que vous avez créée à l'étape précédente.
L'exemple suivant présente la définition de classe partielle avec l'attribut ajouté.
[MetadataType(typeof(CustomerMetadata))] public partial class Customer { }
<MetadataType(GetType(CustomerMetadata))> _ Partial Public Class Customer End Class
Personnalisation de la validation à l'aide d'attributs
Cette section indique comment personnaliser la validation à l'aide de règles de validation par défaut fournies par les attributs Dynamic Data System.ComponentModel.DataAnnotations.
Pour valider un champ de données spécifique à l'aide d'attributs de validation
Dans la classe de métadonnées, créez une propriété ou un champ dont le nom correspond au champ de données à valider.
Appliquez l'un des attributs de l'espace de noms System.ComponentModel.DataAnnotations à la propriété.
L'exemple suivant montre comment appliquer l'attribut System.ComponentModel.DataAnnotations.RequiredAttribute au champ de données Title dans la classe de métadonnées associée. Si un utilisateur entre une chaîne vide, la méthode IsValid lève une exception de validation et génère un message d'erreur.
Remarque : En appliquant l'attribut RequiredAttribute, vous obligez les utilisateurs à entrer une valeur même si la base de données ne le requiert pas.
public class CustomerMetadata { [Required()] public object Title; }
Public Class CustomerMetadata <Required()> _ Public Title As Object End Class
Personnalisation de la validation pour un champ de données individuel à l'aide d'une méthode de classe partielle
Cette section indique comment personnaliser la validation en substituant une méthode de classe partielle qui traite les modifications apportées à un champ de données individuel. Ce type de validation vous permet de créer vos propres règles de validation au lieu de vous appuyer sur les contrôles de validation Dynamic Data intégrés qui sont implémentés dans les attributs System.ComponentModel.DataAnnotations.
Pour valider un champ de données spécifique à l'aide d'une méthode de classe partielle
Substituez la méthode de classe partielle qui traite les modifications apportées au champ de données.
Ajoutez votre logique de validation personnalisée.
L'exemple suivant montre comment substituer la méthode OnTitleChanging dans une classe Customer partielle. La méthode est appelée lors de la modification du champ Title de la table de données Customer. Le code indiqué dans l'exemple vérifie que le nouveau titre entré par l'utilisateur commence par une majuscule. Si la validation des données échoue, la méthode lève une exception. La valeur à valider est passée à la méthode en tant que paramètre unique. Le paramètre est typé afin de correspondre au type des données à valider.
Remarque : Les exceptions de validation qui sont levées dans le modèle de données sont interceptées par le contrôle DynamicValidator. Si une page contient un contrôle DynamicValidator, l'erreur peut être affichée dans la page.
public partial class Customer { partial void OnTitleChanging(string value) { if (!Char.IsUpper(value[0])) { throw new ValidationException( "Title must start with an uppercase letter.");} } }
Public Partial Class Customer Private Sub OnTitleChanging(ByVal value As String) If Not [Char].IsUpper(value(0)) Then Throw New ValidationException( _ "Title must start with an uppercase letter.") End If End Sub End Class
Personnalisation de la validation pour l'ensemble des champs de données à l'aide d'une méthode de classe partielle
Cette section indique comment personnaliser la validation en substituant la méthode de classe partielle qui traite les modifications apportées aux champs de données d'une table. Ce type de validation vous permet de créer vos propres règles de validation au lieu de vous appuyer sur les contrôles de validation Dynamic Data intégrés qui sont implémentés dans les attributs System.ComponentModel.DataAnnotations. Cela s'avère utile lorsque la même logique de validation peut être appliquée à plusieurs champs de données, et vous permet par ailleurs d'effectuer des contrôles de validation qui impliquent plusieurs champs.
Pour valider des champs de données à l'aide d'une méthode de classe partielle
Substituez la méthode de classe partielle OnValidate appelée lorsque des modifications sont apportées aux champs de données de la table.
Ajoutez votre logique de validation personnalisée.
L'exemple suivant montre comment substituer la méthode OnValidate. Cet exemple de code vérifie que le prénom et le nom entrés par l'utilisateur commencent par une majuscule. Si la validation des données échoue, la méthode lève une exception.
Remarque : Les exceptions de validation qui sont levées dans le modèle de données sont interceptées par le contrôle DynamicValidator. Si une page contient un contrôle DynamicValidator, l'erreur peut être affichée dans la page.
partial void OnValidate( System.Data.Linq.ChangeAction action) { if (!Char.IsUpper(this._LastName[0]) || !Char.IsUpper(this._FirstName[0])) throw new ValidationException( "Name must start with an uppercase letter."); }
Private Sub OnValidate(ByVal action As _ System.Data.Linq.ChangeAction) If Not [Char].IsUpper(Me._LastName(0)) OrElse _ Not [Char].IsUpper(Me._FirstName(0)) Then Throw New ValidationException( _ "Name must start with an uppercase letter.") End If End Sub
Exemple
L'exemple montre comment utiliser l'attribut RequiredAttribute pour valider les données Title de la table Customer. Il utilise la méthode de classe partielle OnValidate pour s'assurer que les valeurs entrées par l'utilisateur pour les champs de données Title, FirstName et LastName commencent par une majuscule. Il utilise également la méthode de classe partielle OnOderQtyChanging pour s'assurer que la valeur entrée par l'utilisateur pour le champ de données OrderQty de la table SalesOrderDetails est supérieure à la valeur minimale spécifiée.
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations
<MetadataType(GetType(CustomerMetadata))> _
Partial Public Class Customer
Private Sub OnValidate(ByVal action As System.Data.Linq.ChangeAction)
If Not Char.IsUpper(Me._LastName(0)) _
OrElse Not Char.IsUpper(Me._FirstName(0)) _
OrElse Not Char.IsUpper(Me._Title(0)) Then
Throw New ValidationException( _
"Data value must start with an uppercase letter.")
End If
End Sub
End Class
Public Class CustomerMetadata
<Required()> _
Public Title As Object
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(CustomerMetadata))]
public partial class Customer
{
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
if (!char.IsUpper(this._LastName[0]) ||
!char.IsUpper(this._FirstName[0]) ||
!char.IsUpper(this._Title[0]))
throw new ValidationException(
"Data value must start with an uppercase letter.");
}
}
public class CustomerMetadata
{
[Required()]
public object Title;
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations
Partial Public Class SalesOrderDetail
Private Sub OnOrderQtyChanging(ByVal value As Short)
If value < 100 Then
Throw New ValidationException( _
"Quantity is less than the allowed minimum of 100.")
End If
End Sub
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;
public partial class SalesOrderDetail
{
partial void OnOrderQtyChanging(short value)
{
if (value < 100)
{
throw new ValidationException(
"Quantity is less than the allowed minimum of 100.");
}
}
}
<%@ Page Language="VB"
AutoEventWireup="true" CodeFile="CustomValidation.aspx.vb"
Inherits="CustomValidation" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
<title></title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Example: <%=Title%></h2>
<!-- Enable dynamic behavior. The GridView must be
registered with the manager. See code-behind file. -->
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<form id="form1" >
<!-- Capture validation exceptions -->
<asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1"
/>
<asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2"
/>
<table>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using the Table OnValidate
</td>
<td>
<asp:GridView ID="GridView1"
DataSourceID="GridDataSource"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="Title" />
<asp:DynamicField DataField="FirstName" />
<asp:DynamicField DataField="LastName" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using OnOrderQtyChanging
</td>
<td>
<asp:GridView ID="GridView2"
DataSourceID="GridDataSource2"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="OrderQty" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
</table>
</form>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource"
TableName="Customers" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource2"
TableName="SalesOrderDetails" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
</body>
</html>
<%@ Page Language="C#"
AutoEventWireup="true" CodeFile="CustomValidation.aspx.cs"
Inherits="CustomValidation" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
<title></title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Example: <%=Title%></h2>
<!-- Enable dynamic behavior. The GridView must be
registered with the manager. See code-behind file. -->
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<form id="form1" >
<!-- Capture validation exceptions -->
<asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1"
/>
<asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2"
/>
<table>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using the Table OnValidate
</td>
<td>
<asp:GridView ID="GridView1"
DataSourceID="GridDataSource"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="Title" />
<asp:DynamicField DataField="FirstName" />
<asp:DynamicField DataField="LastName" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using OnOrderQtyChanging
</td>
<td>
<asp:GridView ID="GridView2"
DataSourceID="GridDataSource2"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="OrderQty" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
</table>
</form>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource"
TableName="Customers" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource2"
TableName="SalesOrderDetails" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
</body>
</html>
Imports System
Imports System.Collections
Imports System.Configuration
Imports System.Web.DynamicData
Partial Public Class CustomValidation
Inherits System.Web.UI.Page
Protected _table1 As MetaTable, _table2 As MetaTable
Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs)
' Register data controls with the data manager.
DynamicDataManager1.RegisterControl(GridView1)
DynamicDataManager1.RegisterControl(GridView2)
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Get the table entities.
_table1 = GridDataSource.GetTable()
_table2 = GridDataSource2.GetTable()
' Assign title dynamically.
Title = String.Concat("Customize Validation of the ", _
_table1.Name, " and ", _table2.Name, " Tables")
End Sub
End Class
using System;
using System.Collections;
using System.Configuration;
using System.Web.DynamicData;
public partial class CustomValidation : System.Web.UI.Page
{
protected MetaTable _table1, _table2;
protected void Page_Init(object sender, EventArgs e)
{
// Register data controls with the data manager.
DynamicDataManager1.RegisterControl(GridView1);
DynamicDataManager1.RegisterControl(GridView2);
}
protected void Page_Load(object sender, EventArgs e)
{
// Get the table entities.
_table1 = GridDataSource.GetTable();
_table2 = GridDataSource2.GetTable();
// Assign title dynamically.
Title = string.Concat("Customize Validation of the ",
_table1.Name, " and ", _table2.Name, " Tables");
}
}
Compilation du code
Pour compiler cet exemple de code, vous avez besoin des éléments suivants :
Microsoft Visual Studio 2008 Service Pack 1 ou Visual Web Developer 2008 Express Service Pack 1.
L'exemple de base de données AdventureWorksLT. Pour plus d'informations sur le téléchargement et l'installation de l'exemple de base de données SQL Server, consultez Exemples de produits Microsoft SQL Server : Base de données (en anglais) sur le site CodePlex. Prenez soin d'installer la version appropriée de l'exemple de base de données pour la version de SQL Server que vous exécutez (Microsoft SQL Server 2005 ou Microsoft SQL Server 2008).
Site Web Dynamic Data. Cela vous permet de créer un contexte de données pour la base de données et de créer la classe qui contient le champ de données à personnaliser et les méthodes à substituer. Pour plus d'informations, consultez Walkthrough: Creating a New Dynamic Data Web Site Using Scaffolding.
Voir aussi
Concepts
Vue d'ensemble des modèles de champs Dynamic Data ASP.NET
Vue d'ensemble des modèles de données Dynamic Data ASP.NET
Vue d'ensemble de Dynamic Data ASP.NET
Référence
Classes et méthodes partielles (Guide de programmation C#)
Historique des modifications
Date |
Historique |
Raison |
---|---|---|
Juillet 2008 |
Ajout d'une rubrique. |
Modifications de fonctionnalités dans le SP1. |