Les grandes lignes de la programmation en ASP.NET 2.0

Cécile Muno

Une introduction simple de la programmation en ASP.NET 2.0.

- Titre : Les grandes lignes de la programmation en ASP.NET 2.0

- Auteur : Cécile Muno

- Parution : 12 mars 2007

- Mise à jour : 30 mai 2020

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2007 Cécile Muno. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. ASP.NET versus ASP

- III. Applications ASP.NET 2.0

- III-A. Principes

- III-B. Environnement de développement

- III-B-1. Un serveur

- III-B-2. Un EDI, c'est nécessaire ?

- III-B-3. Visual Studio ou Visual Web Developper

- IV. Dans le vif du sujet !

- IV-A. Première page

- IV-B. Des événements particuliers

- IV-B-1. Application

- IV-B-2. Session

- IV-B-3. PostBack/Non-PostBack

- IV-C. Les Server Controls

- V. Gestion de l'état

- V-A. Champs cachés

- V-B. ViewState

- V-C. Cookies

- V-D. Variable de session

- V-E. Variable d'application

- V-F. L'objet Cache

- V-G. Caching (ou cache HTML)

- V-H. QueryString

- VI. Validation des données

- VI-A. RequiredFieldValidator

- VI-B. RangeValidator

- VI-C. CompareValidator

- VI-D. RegularExpressionValidator

- VI-E. CustomValidator

- VI-F. ValidationSummary

- VII. Les bases de données

- VII-A. Repeater

- VII-B. DataList

- VII-C. DataGrid/GridView

- VII-D. DetailsView

- VIII. Les Master Page

- IX. Quelques compléments d'information

- IX-A. Sources de données

- IX-B. Sécurité

- IX-C. Les Webparts

- X. Conclusion et liens divers

- X-A. Conclusion

- X-B. Liens divers

- X-C. Remerciements

- XI. Téléchargement

I - Introduction

Ce cours est à considérer comme un « pense-bête » d'ASP.NET 2.0 dans le sens où il regroupe les grandes possibilités offertes en programmation web, mais sans entrer dans les détails d'utilisation.
Il existe des cours et tutoriels ainsi que des codes d'exemple qui permettent d'évaluer d'une manière plus approfondie et plus technique les points importants d'ASP.NET 2.0. J'y ferai référence autant que possible afin de vous guider dans l'apprentissage de ce langage.
Je me limite aussi à de la programmation de page web sans aucune utilisation de thèmes, CSS… qui permettent d'élaborer l'aspect présentation des pages aspx. Pour réaliser votre environnement graphique, vous pouvez vous référer aux cours tels que :

- Utiliser des graphiques SVG

- Utiliser les thèmes pour vos sites ASP.NET 2.0

II - ASP.NET versus ASP

Il n'est pas dans mon intention de lancer un grand débat sur le sujet, mais simplement de vous présenter quelques différences fondamentales entre ces deux langages. Ceux qui connaissent ASP pourront ainsi apprécier l'évolution de la programmation web à sa juste valeur.
Les éléments d'information exposés ici sont loin d'être complets, mais, je vous l'ai déjà signalé, je m'en tiens à une approche très générale du langage.

ASP

ASP.NET

code séquentiel

code événementiel

présentation et logique « groupées »

présentation et logique « séparées »

langage interprété

langage compilé

On peut aussi pointer quelques évolutions spécifiques à ASP.NET 2.0 qui découlent de l'environnement DotNet :

- Déploiement et configuration simplifiés

- Choix parmi plusieurs langages pour construire ses pages (C#, VB.NET…)

- L'accès aisé à la programmation de services web

- Développement de ses composants personnels

- Utilisation de Template « Master Page »

- Gestion des « styles »

- L'intellisense qui s'est étendu à tous les niveaux (code, html, css…)

- Nouveaux « Starter Kits » facilitant encore plus la création de portails

III - Applications ASP.NET 2.0

III-A - Principes

L'interaction Client / Serveur est la base principale des applications web. Il est donc très important de bien comprendre le principe de fonctionnement d'ASP.NET dans l'environnement DotNet avec le serveur IIS.
Un petit schéma très simplifié vous aidera peut-être à y voir plus clair :

Voici donc ce qui se passe lorsque vous, utilisateur désirant naviguer sur une page web, générez comme action si l'application que vous désirez atteindre est développée en ASP.NET 2.0 :

- 1 = vous tapez une URL dans votre navigateur et donc, envoyez une requête pour une page aspx d'un client web vers le serveur IIS ;

- 2 = la requête est analysée et le traitement est transféré au runtime, un processus est créé pour exécuter l'application ;

- --> S'il s'agit de la première exécution du code de cette page, le compilateur JIT (Just In Time) compile le code en binaire natif et le stocke en mémoire ;

- --> Si ce n'est pas la première exécution, le code binaire est chargé depuis le cache ;

- 3 = ce code binaire est exécuté puis renvoyé vers le serveur IIS ;

- 4 = IIS renvoie la réponse sous la forme de code HTML strict vers l'utilisateur. Ce code HTML est affiché dans votre navigateur.

III-B - Environnement de développement

III-B-1 - Un serveur

Puisque nous allons créer du code utilisant une liaison Client / Serveur, il est bien entendu nécessaire d'avoir un serveur à disposition. Exactement comme les développeurs PHP / MySQL utilisent la plupart du temps Apache, nous allons devoir initialiser le serveur IIS.
Pour démarrer ce serveur, si ce n'est déjà fait, vous pouvez vous référer au premier paragraphe intitulé « Installation d'un serveur web » de ce tutoriel.

Sous XP Home, il n'est pas aisé d'installer IIS, bien que cela soit possible. Je vous déconseille donc de démarrer sur cette solution.

Si framework .NET n'a pas été installé après le serveur IIS, vous aurez des problèmes d'exécution des pages aspx.

Pour remédier à cet inconvénient à postériori, vous pouvez exécuter une commande du type :

C:\Windows\Microsoft.Net\Framework\v2.0.xx\aspnet_regiis.exe -i ou xx est la version du Framework 2.0 présente sur votre ordinateur.

III-B-2 - Un EDI, c'est nécessaire ?

Nous avons tous l'habitude de travailler dans un environnement de développement intégré bien que cela ne soit pas toujours nécessaire, mais plutôt bien pratique. Il en est de même avec le développement ASP.NET. Vous pouvez, comme pour des applications Winforms, écrire du code dans un éditeur de texte. Voici, en quelques étapes, la réalisation et l'exécution d'une page aspx créée avec le bloc-note :

Étape 1
Créez un site virtuel sur votre IIS et nommez-le, par exemple, « PremierePage ». Si vous n'avez jamais réalisé cette opération, voici comment procéder :

- allez dans le panneau de contrôle de Services Internet (IIS) : Outils d'administration dans le panneau de configuration puis choisissez Internet Informations Services ;

- déroulez les options jusqu'à trouver Site Web par défaut et faites un clic droit ;

- choisissez Nouveau -> Répertoire virtuel… ;

- créez votre répertoire.

Voici en images et sur XP Pro en anglais les étapes décrites ci-dessus :

Terminez votre création en laissant les paramètres par défaut. Pour de plus amples informations, rendez-vous sur les forums Windows.

Étape 2
Ouvrez le bloc-note et créez un fichier avec ce code :

<%@ Page Language="VB" %>
<html>
<body>
<h1>Bonjour</h1>
<br />
<h2>Nous sommes le <%= DateTime.Now.ToString() %>.</h2>
</body>
</html>

Sauvegardez-le à la racine du site que vous avez créé en le nommant par exemple « bonjour.aspx ».

Étape 3
Exécutez cette page aspx dans votre navigateur en tapant son adresse dans la barre de navigation :
http://localhost/PremierePage/bonjour.aspx

et vous devez avoir une page web comme suit :

Vous venez donc de créer votre première page ASP.NET s'exécutant sur un serveur IIS sans avoir ouvert Visual Studio comme support de programmation.

III-B-3 - Visual Studio ou Visual Web Developper

Il est bien évident qu'un EDI digne de ce nom vous offre une multitude d'avantages comme la complétion du code, l'initialisation automatique de vos pages, les contrôles utilisateurs… malgré que, dans quelques cas, il est parfois plus avantageux de coder directement son contrôle dans la page HTML plutôt que de passer par le Designer de l'EDI. Ceci est un sujet qui sera abordé ultérieurement, voire dans un autre cours.

Que vous utilisiez Visual Studio ou Visual Web Developper (EDI gratuit et téléchargeable sur le site de Microsoft France), le démarrage de votre application sera presque la même. La seule différence vient du fait que Visual Studio étant un EDI qui regroupe plusieurs possibilités de développement, vous devrez spécifier que vous désirez travailler avec un nouveau projet web avant d'arriver sur cette page de configuration :

Il est primordial de bien configurer les informations dans Emplacement (Location) et Langage (Language) ainsi que l'adresse du site que vous désirez développer sur votre serveur IIS local (localhost).

Visual Web Developper comporte un serveur « intégré ». Si vous ne comptez l'utiliser qu'en développement, ce serveur Visual Studio est largement suffisant.

Nous sommes maintenant prêts à aborder l'infrastructure d'ASP.NET 2.0.

IV - Dans le vif du sujet !

IV-A - Première page

Enfin ! Un petit exemple en utilisant Visual Studio ou Visual Web Developper pour se familiariser avec l'environnement ASP.NET. Si vous êtes familier avec le « designer » des applications Visual Studio ou Visual Express Edition, ceci vous paraîtra très simple, mais je me permets tout de même de détailler un peu l'interface pour ceux qui abordent ce thème pour la première fois.

Reprenons notre EDI et, après avoir bien configuré les données au niveau du serveur et du nom de l'application, l'interface doit maintenant ressembler à ceci :

Vous pouvez remarquer que l'interface des applications ASP.NET diffère des applications Winforms, mais nous y retrouvons quand même pas mal de points communs, notamment :

l'explorateur de solution contenant notre projet « WebApp », sa localisation « http://localhost/WebApp » et la page par défaut « Default.aspx », que nous pouvons bien évidemment renommer ;
les propriétés des contrôles et pages grâce auxquelles nous allons pouvoir définir des comportements graphiques ou autres ;
la page de code où une partie de codage est générée automatiquement par l'environnement de développement ;
deux boutons « design » et « source » nous permettant de passer aisément d'un mode à l'autre dans notre page aspx. Remarquez aussi que, si vous déplacez votre curseur dans la partie code, à droite du bouton « source », vous apercevez l'endroit exact où se situe le curseur dans l'arborescence des balises HTML ;
la boite à outils, ancrée ou non, contenant les contrôles utilisables pour votre application web :

Passons maintenant en mode « design ». Faites glisser sur la page les contrôles suivants et changez leurs propriétés en suivant le tableau ci-après :

Contrôle

Propriété

Contenu

Un « label » : Label1

Text

« Nom : »

Un « textbox » à droite de Label1 : TextBox1

BorderWidth

2

Un « button » sous Label1 : Button1

Text

« Cliquez »

Un « label » sous le bouton : Label2

Text

« Bonjour »

Remarque : dans la propriété BorderWidth, par défaut, l'unité de mesure est en « px » (pixel). Cela correspond bien aux normes HTML.

Votre page doit ressembler à ceci :

Si vous retournez en mode « source », vous constatez que le code HTML s'est enrichi automatiquement des contrôles que vous avez intégrés à votre page ainsi que des propriétés modifiées via la page de propriétés. Rien ne vous empêche, au fil de l'expérience acquise dans le développement ASP.NET, de taper immédiatement le code de vos contrôles dans la page HTML, vous verrez que le « design » se met aussi à jour de la même manière. L'avantage de coder directement dans le HTML se trouve dans le libre choix que vous avez du type de contrôle placé.
Par exemple, vous voyez dans notre application que le TextBox1 est considéré comme un « asp:textbox » ce qui, niveau exécution du code prend plus de place et de temps qu'un simple « asp:inputbox » alors que le résultat, ici, est exactement le même. Pour les utilisateurs avertis ayant déjà réalisé des sites web en HTML, il peut aussi être plus aisé de coder directement dans la page source.

À ce point, nous avons des contrôles placés sur une page aspx, mais encore aucune action n'est définie. Vous avez beau taper un nom dans « TextBox1 » et cliquer sur le « Button1 », rien ne se passe. En effet, il faut associer un événement au bouton « Cliquez ». Pour ce faire, double-cliquez sur le bouton en mode design et l'environnement de développement va créer une méthode associée à l'événement « Click » du bouton :

Remarquez qu'une nouvelle page est apparue « Default.aspx.vb » qui contient le code associé aux méthodes et événements. Dans votre événement « Button1_Click », tapez cette ligne :

label2.text=label2.text & «   » & textbox1.text

Vous verrez en cours de frappe que l'aide à la complétion existe aussi, exactement comme dans les applications winforms. Maintenant, vous pouvez exécuter votre page aspx (F5). Lors d'une première exécution, vous allez certainement obtenir ce message :

Par défaut, le débogage n'est pas activé au niveau des applications web. Je vous conseille fortement de l'activer en répondant OK avec la première option cochée.

Ensuite, testez en tapant un nom et en cliquant sur votre bouton.

Prenons un peu le temps de voir le code HTML de la page exécutée :

Vous constatez que des champs cachés ont été générés. Le champ nommé _VIEWSTATE contient toutes les informations d'état des contrôles de la page. Il est intéressant, car est accessible par le programmeur et peut contenir des données internes aux pages. Cette notion de conservation de données sera développée plus loin dans ce tutoriel.

Le source correspondant à cette petite application se trouve dans la partie téléchargement sous le nom « WebApp ».

IV-B - Des événements particuliers

En tant que programmeur, nous sommes pratiquement tous habitués à entendre parler d'événements, nous venons encore de nous en servir dans notre première petite application. Nous connaissons ceux liés à une action comme « click », répondant à une action sur la souris. ASP.NET possède le même genre d'événements, mais, certains sont assez particuliers et très importants pour le déroulement et le contrôle de ce genre d'application.

IV-B-1 - Application

Événement

Description

Application_Start

exécuté lors du premier appel à une page du site depuis le démarrage de IIS

Application_End

appelé lorsque l'application se termine, cela ne signifie pas que IIS s'arrête, mais est d'office appelé si, pour une raison quelconque IIS est arrêté

IV-B-2 - Session

Événement

Description

Session_Start

appelé lors de chaque nouvelle session d'un navigateur client

Session_End

fin de session : lors d'un timeout ou lors d'une destruction explicite (Session.Abandon()) via un lien « Log Out » par exemple

Il faut aussi savoir qu'une session peut stocker ses données en mode « InProc » (dans le process en mémoire) ou en mode « Sql… » (dans une BD SqlServer) via la base de données « AspNetState ».
Application et Session sont des notions très importantes en ASP.NET. Elles jouent en effet un rôle très actif au niveau de la vie d'un site et, notamment, au niveau de la pérennité des données véhiculées dans le site lui-même.

Un petit schéma pour mieux visualiser la différence entre « Application » et « Session » :

Soit trois utilisateurs U1, U2 et U3 qui envoient une requête vers le serveur IIS. Il y aura un seul objet « Application » commun à tous les utilisateurs du site, mais trois objets « Session » correspondant chacun à un utilisateur précis.
Si U2 quitte son poste de travail sans couper son navigateur :

- s'il n'y a pas de timeout, les autres utilisateurs peuvent accéder à S2 ;

- s'il y a timeout et que U2 revient visiter le site, une nouvelle session S4 sera créée.

Par contre, si U2 coupe son navigateur, S2, persiste jusqu'à un éventuel timeout ou jusqu'à la fin de l'application

IV-B-3 - PostBack/Non-PostBack

Cet événement génère un appel au serveur. Dans ASP.NET 2.0, la page se rappelle continuellement en déclenchant cet événement. C'est au programmeur de créer les conditions de passage d'une page à l'autre.

IsPostBack est une propriété de la page booléenne (read-only) qui permet justement d'effectuer ce genre de test.
Par exemple, on l'utilise dans l'événement Page_Load pour éviter de recharger des données persistantes.

AutoPostBack est une propriété des contrôles qui active le déclenchement d'un aller-retour sur le serveur.

Surtout, ne pas s'affoler, ces notions seront reprises maintes fois dans le développement du tutoriel, mais sont nécessaires niveau vocabulaire pour évoluer dans la manipulation du code proprement dit.

IV-C - Les Server Controls

Un petit mot sur les types de contrôles présents dans ASP.NET. Il existe deux jeux de contrôles s'exécutant côté serveur :

les Web Controls, gérés par des événements, ils ressemblent plus aux objets utilisés dans du développement winforms c'est-à-dire qu'ils possèdent des propriétés (« font », « backcolor »…) facilitant la mise en forme.
Ils dépendent de « System.Web.UI.WebControls » ;

les HTML Controls qui correspondent directement aux balises HTML. Les attributs des balises correspondantes sont accessibles via les propriétés de ces contrôles. Pour faire une analogie avec les « WebControls », ceux-ci ne possèdent qu'une balise « Style » pour la mise en forme, cela est plutôt limitatif.
Ces derniers dépendent eux de « System.Web.UI.HtmlControls ».

Les exemples étant plus parlant que les belles phrases, vous trouverez dans la section téléchargement quelques petits exemples de codes pour se familiariser avec l'utilisation des contrôles en ASP.NET.

V - Gestion de l'état

Il y a maintes manières d'implémenter l'état conversationnel dans une application web, mais, ici, nous allons parler seulement des plus fréquents.

V-A - Champs cachés

Ces champs sont caractérisés par leur nom et leur valeur de type String. Ces champs n'existent pas à l'appel de la page, il est donc nécessaire de ne pas oublier certains tests de validité.

V-B - ViewState

Comme dit lors du premier exemple de page aspx, le ViewState, nouveau concept introduit par Microsoft avec ASP.NET, représente l'état de l'ensemble des contrôles d'un page. Les informations sont sauvées sous forme d'un flux sérialisé dans la page HTML et le champ caché _VIEWSTATE permet le transit de ces informations entre le client et le serveur.
Il peut être désactivé au niveau d'un contrôle, au niveau d'une page ou au niveau d'une application en plaçant la propriété EnabledViewState à False.

Le plus intéressant est que le programmeur peut y ajouter ses propres informations sous forme d'objets indexés par une clé de type String.

Pour sauvegarder et lire une information, voici comment utiliser le ViewState, par exemple pour modifier un argument dans une requête de sélection :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
ViewState("tri") = "nom"
ConstruireRequete()
End If
End Sub

Private Sub ConstruireRequete
Dim tri As String = CType(ViewState("tri"), String)
Dim rq As String = "SELECT * FROM UneTable ORDER BY " & tri
End Sub

Protected Sub cmdLocalite_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdLocalite.Click
ViewState("tri") = "localite"
ConstruireRequete()
End Sub

V-C - Cookies

Un petit mot que tous les internautes connaissent, mais, probablement, ne savent pas exactement à quoi il fait référence.
Pour des exemples de création et d'exploitation de cookies, voici les références dans la FAQ ASP.NET (version VB.NET) :

- Comment créer un cookie ?

- Comment lire un cookie ?

- Comment détecter si le navigateur supporte les cookies ?

V-D - Variable de session

« Session » est un objet qui s'utilise un peu comme le ViewState, c'est-à-dire avec une clé, mais se comporte plutôt comme une table de hachage.

Prenons deux pages aspx :
page1.aspx : page dans laquelle nous encodons, par l'intermédiaire d'une TextBox, un nom de société ;
page2.aspx : page dans laquelle nous affichons le nom de la société (vous comprenez que le but est d'avoir une page d'affichage de données de société se trouvant par exemple dans une base de données).

Protected Sub cmdAfficheSoc (Byval sender As Object, ByVal e As System.EventArgs) Handles cmdAfficheSoc.Click
Session("NomSoc") = txtNomSoc.Text
Response.Redirect("page2.aspx")
End Sub

Code de la page1.aspx : L'utilisateur introduit un nom de société dans la TextBox nommée « txtNomSoc ». Cette information est sauvée en Session avant de passer à la page2.aspx

Protected Sub Page_Load (Byval sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Session("NomSoc") IsNot Nothing Then
lblNomSoc.Text = CType(Session("NomSoc"), String)
Else
Response.Write("Aucune société n'a été choisie !")
End If
End Sub

Code de la page2.aspx : Un test est effectué pour savoir si la variable de session contient bien une donnée. Celle-ci est affichée en passant par un transtypage.

Il est évident que cet exemple est très simpliste et que l'objet Session permet bien d'autres utilisations. Voici quelques points liés à l'objet Session (liste non exhaustive) :

- initialisation de l'objet Session : événements Session_Start et Session_End déclenchés par le serveur et accessibles via le fichier Global.asax pour le programmeur ;

- expiration de la session ;

- session avec ou sans cookies ;

- session sécurisée.

Pour des informations complémentaires, profitez et abusez de la FAQ ASP.NET (VB.NET).

V-E - Variable d'application

La grande différence avec l'objet Session se situe dans le fait qu'un objet Application conserve des données pour l'ensemble des utilisateurs d'un même site web. Il s'utilise de la même manière que l'objet Session.

Protected Sub Page_Load (Byval sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim cpt As Integer = 0
Application.Lock()
If Application("Compteur") IsNot Nothing Then
cpt = CType(Application("Compteur"), Integer)
End If
cpt = cpt + 1

Application("Compteur") = cpt
Application.UnLock()
lblVisite.Text = "Page vue : " & cpt & " fois."
End Sub

L'objet Application étant commun à tous les utilisateurs du site (rappelez-vous le schéma précédent), il est préférable de bloquer l'accès lors de l'écriture et, bien entendu, de ne pas oublier l'action inverse.
Comme toujours, vous trouverez aussi des exemples et explications dans la FAQ asp.net, par exemple :
Nécessité de bloquer les variables d'application

V-F - L'objet Cache

Comme l'objet Application, il conserve aussi des données accessibles à tous les utilisateurs, mais il possède quelques avantages non négligeables :

- gestion interne de locking ;

- plus rapide ;

- gestion des dépendances.

En ce qui concerne les dépendances, on peut en citer quelques-unes très succinctement, car ce genre de programmation demanderait presque un tutoriel à elle toute seule !

- dépendances de temps : permet de faire expirer automatiquement une donnée à une date/heure absolue ;

- dépendances fichiers : le serveur d'application peut mettre à jour des données lorsque cells-ci sont modifiées dans le fichier associé ;

- dépendances SQL : sous SqlServer 2000 et 2005. Agit de la même manière avec une base de données grâce au « poling » (interrogation du serveur vers la BD) ;

- le callback : association d'une procédure qui est rappelée, non pas dès que la donnée est supprimée, mais à la prochaine exécution de la page qui contient la procédure.

V-G - Caching (ou cache HTML)

Un autre aspect de la mise en cache des données suivant diverses méthodes. Ici aussi, il serait trop long d'étendre leur mode d'utilisation :

- cache de sortie (output cache) : prend une « copie » instantanée du flux HTML puis supplante toute action de requête en imposant sa « copie » gardée en cache ;

- substitution : ce contrôle permet de ne pas mettre en cache une partie de la page même si le cache est activé ;

- profils de cache : peuvent être créés dans le Web.Config et associé par leur nom aux pages qui en ont besoin ;

- fragments de cache : fonctionne comme le cache de sortie, mais donne la possibilité au programmeur de ne mettre en cache qu'une partie de la page HTML. Le frament caching peut se faire grâce aux usercontrols qui disposent eux-mêmes d'une directive Output.

V-H - QueryString

Ou « chaîne de requête ». Permet de faire passer des informations via l'URI d'une page à une autre.
En reprenant l'exemple d'un ID de société sélectionné dans une page dont les données sont présentées dans une autre page, on aurait très bien pu indiquer cet ID via l'URI lors de l'appel à la deuxième page.

Vous avez choisi la société ayant un ID = 1235, voici comment passer l'identifiant à la page suivante :

<A href="page2.aspx?idsoc=1235"></A>

Pour récupérer l'ID dans la seconde page, il vous suffira de coder comme suit :

<p>Vous avez choisi la société : & Request.QueryString("idsoc")</p>

Vous comprenez maintenant le pourquoi de certaines URL complexes du genre :
http://www.monsite.com/repertoire/liste.asp?id=1257&lng=fr&action=del&email=abc@prov.fr

VI - Validation des données

Avec la sécurité, la validation des données est en général la chose la plus importante dans un site web. Ici, nous allons pouvoir travailler côté client et côté serveur, c'est indispensable pour prévenir au plus tôt l'utilisateur d'une erreur éventuelle. En effet, il est inutile d'envoyer une demande au serveur si l'information transmise est erronée : cela génère une perte de temps et un encombrement inutile du serveur.

La validation côté client est donc celle qui intervient la première et se fait en général en JavaScript. ASP.NET fournit des contrôles de validation qui génèrent le code JavaScript associé, vous évitant de connaitre à fond le langage et de devoir taper le code.

Les principaux contrôles de validation sont :

- RequiredFieldValidator ;

- RangeValidator ;

- CompareValidator ;

- RegularExpressionValidator ;

- CustomValidator ;

- ValidationSummary.

Voyons un peu les caractéristiques générales de chacun.

VI-A - RequiredFieldValidator

Le plus fréquemment utilisé, car est le seul qui peut s'assurer qu'un champ n'est pas vide. En effet, tous les autres contrôles de validation acceptent un champ vide donc, associer ce contrôle de validation aux autres contrôles permet cette vérification essentielle.
Le RequiredFieldValidator a donc pour fonction de vérifier qu'un champ a été modifié. Ses propriétés principales à renseigner sont :

Nom de la propriété

Utilisation

ControlToValidate

doit contenir le nom du contrôle à valider

ErrorMessage

message à afficher en cas d'erreur dans le contrôle ValidationSummary

InitialValue

contient une valeur qui invalide le contrôle si celui-ci est égal à cette valeur précise

Text

texte affiché en cas de non-validation

Exemple de RequiredFieldValidator sur une TextBox nommée TxtNom :

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ControlToValidate="TxtNom" ErrorMessage="Admin n'est pas un nom valide"
SetFocusOnError="True" InitialValue="Admin"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ControlToValidate="TxtNom" ErrorMessage="Le champ nom est obligatoire"

Vous remarquez que pour valider le nom qui est obligatoire, il nous faut 2 contrôles RequiredFieldValidator.
Un pour signaler que le nom ne peut pas être un champ vide, l'autre pour interdire l'utilisation du nom « Admin ».

Une petite astuce dans la FAQ ASP.NET

VI-B - RangeValidator

Comme son nom l'indique, il sera utilisé pour valider l'encodage entre des bornes données. Par exemple, encoder un nombre entre 1 et 10.
Les propriétés sont pratiquement identiques à celles du contrôle précédent :

Nom de la propriété

Utilisation

ControlToValidate

doit contenir le nom du contrôle à valider

ErrorMessage

message à afficher en cas d'erreur dans le contrôle ValidationSummary

MinimumValue

valeur minimale de la plage de données

MaximumValue

valeur maximale de la plage de données

Text

texte affiché en cas de non-validation

Exemple de validation entre 1 et 10 :

<asp:Label ID="Label1" runat="server" Text="Entrez une valeur comprise entre 1 et 10 :"</asp:Label>
<asp:TextBox ID="TxtValeur" runat="server"></asp:TextBox>
<asp:RangeValidator ID="RangeValidator1" runat="server" ErrorMessage="RangeValidator"
MaximumValue="10" MinimumValue="1" Type="Integer"
ControlToValidate="TxtValue">Valeur entre 1 et 10 requise !</asp:RangeValidator>

VI-C - CompareValidator

Il utilise un opérateur pour comparer les valeurs en présence et valider leur concordance. La situation la plus courante d'utilisation est, bien entendu, lors d'une deuxième saisie d'un mot de passe.
Les propriétés restent aussi dans les mêmes normes. Par contre, vous pouvez avoir plusieurs types de validation :

Comparaison à un type.

<asp:CompareValidator runat="server" ID="CompareValidator1" ControlToValidate="TxtValeur" Type="Integer"
Operator="DataTypeCheck" ErrorMessage="Doit être un chiffre entier de type integer !"</asp:CompareValidator>

Comparaison à une valeur.

<asp:CompareValidator runat="server" ID="CompareValidator1" ControlToValidate="TxtValeur" Type="Integer"
Operator="GreaterThan" ValueToCompare="0" ErrorMessage="Un chiffre positif est requis !"</asp:CompareValidator>

Comparaison à un autre champ.

<asp:CompareValidator runat="server" ID="CompareValidator1" ControlToValidate="TxtMotPasse2" Type="String"
Operator="Equal" ControlToCompare="TxtMotPasse1"
ErrorMessage="Les mots de passe ne correspondent pas !"</asp:CompareValidator>

N'oubliez pas que ce contrôle accepte un champ vide et qu'il faut donc associer un RequiredFieldValidator aux champs qui ne peuvent pas être vides !

Cela est aussi valable pour le RangeValidator.

VI-D - RegularExpressionValidator

Ce contrôle valide un champ suivant une expression régulière. Il convient pour des tests de validation très complexes, mais demande beaucoup de ressources donc, ne l'utilisez pas pour des validations qui peuvent se faire aisément avec plusieurs autres contrôles de validation.
Il utilise les mêmes propriétés que les contrôles précédents avec en plus une propriété ValidationExpression qui correspond évidemment à l'expression régulière de test.
Un petit exemple de validation d'un numéro de compte bancaire pour en voir l'application :

<asp:Label ID="Label1" runat="server" Text="Entrer votre numéro de compte :"</asp:Label>
<td><asp:TextBox ID="TxtCptBancaire" runat="server"></asp:TextBox>
<td><asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ErrorMessage="RegularExpressionValidator" ControlToValidate="TxtCptBancaire"
ValidationExpression="^\d{3}-\d{7}-\d{2}$">Format incorrect
</asp:RegularExpressionValidator>

Un autre petit exemple dans la FAQ ASP.NET : validité d'une adresse IP

Visual Studio vous propose une liste d'expressions régulières courantes accessible dans la propriété ValidatorExpression du contrôle.

VI-E - CustomValidator

L'utilisateur définit lui-même une fonction pour effectuer la validation lorsque les contrôles standards ne peuvent pas assumer ce rôle.
Dans ce cas, les propriétés sont un peu différentes.

Dans le cas d'une validation côté client :

- la propriété ClientValidationFunction contient le nom de la fonction ;

- la fonction doit être sous la forme : Function ValidationPersonnelle (source, arguments) ;

- la source est l'objet CustomValidator côté client ;

- arguments est un objet comportant deux propriétés : Value et IsValid ;

- la propriété Value est la valeur à valider ;

- la propriété IsValid est un booléen retournant le résultat de la validation.

La validation côté client s'effectue avec du code JavaScript soit entre les balises ad hoc, soit dans un fichier « .js » séparé.
Ce genre de code est bien connu des développeurs JavaScript :

<script language="javascript">
function Validation (obj, args)
{
}
</script>

Dans le cas d'une validation côté serveur :

Placez le code de validation dans l'événement OnServerValidate.

Vous trouverez un exemple de CustomValidator dans la source « DemoValidation », chapitre des téléchargements !

VI-F - ValidationSummary

Ce contrôle n'est pas un contrôle de validation à proprement parler, il sert à afficher sous différentes formes le résultat de tous les contrôles de validation sur la page aspx si une erreur est survenue. Il est bien évident que vous pouvez l'omettre et gérer vous-même un affichage d'erreur.

Le contrôle ValidationSummary s'affiche dès que la propriété IsValid de la page est à False.
Il interroge les différents contrôles non valides et récupère la valeur de leur propriété ErrorMessage.
Pour afficher le résultat, vous avez les DisplayMode suivants à votre disposition :

- List : simple liste ;

- BulletList : liste avec puces ;

- SingleParagraph : les messages d'erreur sont concaténés les uns à la suite des autres, séparés par une virgule.

L'emplacement de l'affichage peut s'effectuer de deux manières :

- à l'emplacement du contrôle ValidationSummary : mettre sa propriété ShowSummary = True ;

- dans une boite de dialogue : mettre sa propriété ShowDialog = True.

Il est aussi intéressant de s'arrêter un peu à la propriété ValidationGroup des contrôles utilisateurs. En effet, regrouper certains contrôles sous un même nom dans la propriété ValidationGroup permet de valider d'abord une série de champs puis une autre suivant le résultat de la première validation.

Un exemple nommé DemoValidation est repris dans la rubrique téléchargement. Il regroupe un peu tous les contrôles de validation et vous en montre une simple utilisation.

VII - Les bases de données

Nous n'allons pas ici reprendre les principes du modèle ADO.NET. Il existe assez de cours et tutoriels sur developpez.com pour s'initier à cet outil. Je vous invite à parcourir la partie « .NET et les bases de données » de la page cours du forum DotNet. Rappelons juste ce qui concerne ce cours : ADO.NET permet 2 modes de connexion, le mode connecté via des objets DataReader (forward-only) et le mode déconnecté via des objets DataSet. Pour les anciens utilisateurs des technologies Microsoft, le DataSet est le remplaçant du RecordSet de l'ancien modèle ADO. Il ne faut pas pousser la comparaison plus loin, car le DataSet est bien plus puissant et peut comporter des tables, des vues et des relations ce qui était impossible avec un RecordSet.

Au niveau de la conception et de l'exploitation des bases de données, le principe de développement ne change pas en faisant de l'ASP.NET, il faut toujours une connexion, des commandes et des requêtes. Le point le plus délicat en programmant pour le web est l'endroit où il faut se connecter, la persistance de la connexion ainsi que la persistance des données. Suivant le type d'application à déployer, la structure d'accès peut se voir modifiée, mais ceci fait partie d'un cours bien plus avancé.

Voyons comment accéder à une base de données en ASP.NET 2.0 et comment utiliser les différents contrôles liés aux données.

VII-A - Repeater

Le contrôle Repeater affiche le contenu d'une liste sur base d'un modèle (template), mais ne permet pas l'édition de ces données.

VII-B - DataList

Le contrôle DataList implémente déjà une mise en forme qu'il suffit de compléter. Par contre, il manque de souplesse lorsque l'on désire « jouer » sur deux ou trois lignes.
Il permet également l'édition de données s'il est lié à une DataTable.

On définit le modèle (template) du Repeater et de la DataList pour chaque ligne de données grâce à une balise HTML : ItemTemplate.

D'autres « templates » peuvent être utilisés en complément :

- AlternatingItemTemplate : s'utilise pour définir l'affichage des lignes paires de la liste. Dans ce cas, ItemTemplate n'est plus valide que pour les lignes impaires ;

- HeaderTemplate : concerne l'entête de liste et est donc utilisé avant l'affichage de la liste ;

- FooterTemplate : concerne le pied de liste et est donc utilisé après l'affichage de la liste ;

- SeparatorTemplate : désigne l'aspect du séparateur de lignes.

Dans le cas d'une DataList, vous avez aussi la possibilité d'utiliser :

- SelectedItemTemplate : permet de donner un affichage différent à la ligne sélectionnée ;

- EditItemTemplate : s'applique aux lignes en cours d'édition.

VII-C - DataGrid/GridView

Contrairement aux deux contrôles précédents, le DataGrid n'est pas basé sur des modèles, mais possède ses propres propriétés de mise en forme assez semblables à celles connues en développement WinForms.
Malgré tout, l'environnement Web impose d'autres attributs notamment pour gérer la pagination : AllowPaging, PageSize, OnPageIndexChange…

La pagination permet d'éviter, entre autres, de passer la totalité des données de la source à une page.

Dans le framework 2.0, le DataGrid est « remplacé » par le GridView. Bien des choses complexes sont facilitées avec ce nouveau composant.

Malgré tout, le DataGrid est toujours disponible pour les inconditionnels !

Bien que le DataGrid puisse aussi supporter ces mises en forme, le GridView en facilite l'implémentation directement dans ses propriétés :

- Possibilité de tris sur les colonnes.

- Interaction avec l'utilisateur : modification, suppression des données.

- Possibilité d'ajouter des colonnes indépendantes des données (boutons, lien, case à cocher ou templateField).

VII-D - DetailsView

Comme le GridView, il affiche des données dans une grille, mais une ligne à la fois. Il peut être intéressant de combiner les 2.
Par exemple, un GridView qui affiche la liste des employés et un DetailsView en dessous qui affiche la fiche descriptive de l'employé sélectionné dans le GridView. Tout cela en DataBinding bien sûr !

VIII - Les Master Page

Bien que ce tutoriel n'a pas la vocation de mettre en page votre site, je me dois quand même de vous glisser un petit mot sur cette grande nouveauté d'ASP.NET 2.0 que sont les Master Page. Ces pages vous permettent en effet de créer un modèle (template) générique pour votre site web qui sera appliqué aux pages dudit site auxquelles vous avez décidé de l'appliquer, mais pas automatiquement à toutes les pages. L'avantage de ce système est de ne pas devoir ajouter à chaque page les éléments répétitifs qui les composent. La Master Page ne vous empêche pas pour autant d'avoir certaines pages différentes.

Quel que soit le choix de votre modèle, la mise en place s'effectue en passant par l'ajout d'un élément à votre solution web soit par le chemin classique :
Fichier -> Nouveau Fichier -> Page maître (File -> New File -> Master Page)

soit en vous plaçant sur votre projet et en cliquant avec le bouton droit de la souris :

Vous devez évidemment nommer votre Master Page et spécifier le langage dans lequel vous allez la programmer. De préférence, cochez aussi la case
« Placer le code dans un fichier distinct » (Place code in separate file) afin d'en faciliter la lecture.

La page créée doit ressembler à ceci :

Nous pouvons maintenant y ajouter les éléments dont nous avons besoin pour créer notre modèle. Pour cela, il est préférable de passer en mode Design.
Pour placer et définir les éléments que vous désirez, vous allez utiliser les « ContentPlaceHolder ».

Pour associer la Master Page voulue avec une page web lors de sa création : ajoutez cette nouvelle page (comme décrit ci-dessus, mais en choisissant « Page Web » au lieu de « Page Maître ») pour arriver à cet écran :

Il vous suffit de cocher la case de « Sélectionner la page maître » pour que l'association soit déterminée.

Afin d'en savoir un peu plus sur la manière dont fonctionne une Master Page, je vous suggère de lire le tutoriel de Ronald Vasseur.

IX - Quelques compléments d'information

Un grand merci à Stéphane Eyskens (site perso) pour ces précisions.

IX-A - Sources de données

Une grande nouveauté d'ASP.NET 2.0 concernant l'acquisition et la mise à jour des données est l'apport de nouveaux contrôles « sources de données » tels que :

SqlDataSource
Permet de spécifier une connexion à une base de données. On peut l'utiliser pour gérer la sélection et la mise à jour des données via ses propriétés SelectCommand, UpdateCommand, InsertCommand et DeleteCommand. La construction de requêtes paramétrées est entièrement prise en charge par le designer.
Il est désormais possible de créer un GridView gérant l'affichage et la modification des données sans créer aucune ligne de code.
L'avantage de ce contrôle est clairement de faciliter l'accès aux données. Cependant, dans les grosses structures où la logique d'accès aux données réside plutôt dans une DAL (Data Access Library), on préfèrera utiliser les méthodes traditionnelles telles qu'avec ASP.NET 1.0 ou se pencher sur le contrôle ObjectDataSource.

Voici quelques captures d'écran lors du paramétrage d'un contrôle SqlDataSource :

En glissant un contrôle sur la page, on a automatiquement accès à son paramétrage

La recherche du driver et la connexion à la base de données se font de manière simple et assez semblable à ce qu'on connait dans divers modes de programmation assistée

Construire sa requête par la sélection des tables et des champs

Construire les clauses aussi par sélection et références

Voilà quelques images d'exploitation du SqlDataSource, je vous laisse le plaisir de « jouer » avec toutes ses fonctionnalités !

ObjectDataSource

Ce contrôle permet de lier des contrôles de données (GridView, FormView…) à une source de données via une logique personnelle implémentée dans une classe. Cette dernière devra respecter certaines règles pour pouvoir être utilisée dans le modèle de liaison des données d'ASP.NET 2.0.

XmlDataSource

Permet de lier des sources XML à des contrôles.

SiteMapDataSource

Permet de lier le fichier Web.sitemap qui décrit la navigation possible d'une application.

IX-B - Sécurité

La grande nouveauté en terme de gestion de sécurité apportée par ASP.NET 2.0 est sans aucun doute le « MemberShip ». Il facilite grandement la gestion des utilisateurs/rôles d'une application. Cette gestion peut se faire via une interface d'administration dont peut bénéficier tout site développé avec Visual Studio 2005 via le menu « Website => ASP.NET Configuration ». En outre, le membership :

- permet d'effectuer une gestion d'utilisateur via l'API de manière programmatique ;

- offre une collection de contrôles orientés utilisateurs. Ces contrôles sont repris dans l'onglet « Login » de la barre d'outils dans Visual Studio 2005 (Login, LoginView, PasswordRecovery, LoginStatus, LoginName, CreateUserWizard, ChangePassword) ;

- donne la possibilité d'implémenter son propre fournisseur de sécurité.

Pour vous démontrer un bel exemple du dernier point soulevé, je vous convie à vous plonger dans « Implémenter son propre MemberShip provider ».

IX-C - Les Webparts

Les Webparts permettent entre autres d'effectuer ce type d'opération :

- permettre à l'utilisateur de personnaliser facilement le layout d'une page ;

- permettre d'isoler de la fonctionnalité (flux RSS, calendrier, inclusion de pages, édition de contenu…) et de réutiliser cette fonctionnalité dans des applications web dynamiques (MOSS par exemple).

À cette fin, toute une série de contrôles a été ajoutée à Visual Studio 2005 sous l'onglet « Webparts ».

Pour une lecture complémentaire sur le sujet, vous pouvez vous référer à :

Introduction aux Webparts d'ASP.NET 2.0
Utilisation et connexion de Webparts

X - Conclusion et liens divers

X-A - Conclusion

J'espère que cette approche rapide du développement web en ASP.NET 2.0 vous aura donné l'envie de plonger dans l'univers des sites web et, surtout, vous aura aidé à débuter dans ce domaine.

Il reste encore bien des choses à expliquer dans divers domaines afin d'arriver à produire un site de haute qualité, notamment au niveau :

- de la sécurisation des sites ;

- des Webparts ;

- des services web et des extensions SOAP - WS-I ou WSE ;

- de la configuration des applications ;

- du déploiement ;

- de la supervision ;

- …

Cela fait/fera certainement partie de divers tutoriels existants ou à venir sur le site de developpez.com.
Je vous encourage vivement à venir partager vos expériences créatives dans le forum « Vos contributions » des forums DotNet.

X-B - Liens divers

Un petit récapitulatif des divers liens concernant ASP.NET 2.0 :

Developpez.com
Les forums DotNet
Le forum ASP.NET (VB)
Le forum ASP.NET (C#)
Les Faq's ASP.NET
Les tutoriels DotNet (section ASP.NET)
Les livres DotNet (section ASP.NET)
Les outils DotNet (liens de téléchargement)
Le forum des contributions (où nous vous attendons impatiemment !)

Microsoft France
Visual Web Developper
Le centre de développement ASP.NET
Le coach ASP.NET

X-C - Remerciements

Merci à l'équipe DotNet pour son soutien lors de la rédaction de ce tutoriel et plus particulièrement à tous les membres qui ont commentés, complétés et relus mes écrits.

XI - Téléchargement

Voici regroupés dans cette section, les petits exemples d'applications qui illustrent ce tutoriel. Ils sont volontairement simples et évolutifs dans l'optique de toucher vraiment les débutants n'ayant même jamais eu de contact avec le développement Web.

WebApp
Une simple petite page qui affiche une donnée dans un « label » en cliquant sur un « button »

Version VB.NET : WebApp.zip (miroir)
Version C# : csWebApp.zip (miroir)

WebControls1
Utilisation des contrôles « RadioButton » et, surtout, de la propriété « AutoPostBack ». À noter, la propriété « GroupName » très utile pour des groupes de contrôles.

Version VB.NET : WebControls1.zip (miroir)
Version C# : csWebControls1.zip (miroir)

WebControls2
Utilisation d'une « DropDownList » pour sélection ainsi que de la propriété « IsPostBack » de la page.

Version VB.NET : WebControls2.zip (miroir)
Version C# : csWebControls2.zip (miroir)

WebControls3
Un exemple avec le contrôle « Panel » utile pour générer des contrôles par programmation, contrôler la visibilité et l'apparence des contrôles qu'il contient…

Version VB.NET : WebControls3.zip (miroir)
Version C# : csWebControls3.zip (miroir)

DemoValidation
Utilisation des contrôles de validation

Version VB.NET : DemoValidation.zip (miroir)
Version C# : étant donné que pratiquement tout se détermine via les propriétés des contrôles de validation proprement dits, il n'y a pratiquement pas de code pur. Le seul petit exemple se situe dans le CustomValidator, mais est tellement simple qu'une version C# me semble inutile !

BaseDeDonnees
Plusieurs petits exemples d'affichage et d'utilisation des contrôles liés aux données

Pour exécuter ces exemples, vous devez définir chaque page comme page de démarrage suivant celle que vous désirez exécuter ! Voici une image pour vous expliquer comment procéder :

Définir comme page de démarrage la page que vous désirez exécuter

Faites attention que, exécuter la page « Affichage.aspx » seule, n'a aucune raison d'être, car elle dépend d'un paramètre passé dans l'URL par la page « GridView.aspx » Version VB.NET : BaseDeDonnees.zip (miroir)
Version C# : csWebControls3.zip (miroir)