Académique Documents
Professionnel Documents
Culture Documents
Intro Aspnet
Intro Aspnet
NET
avec Visual Studio 2010
http://tahe.developpez.com
1/46
Introduction
Nous nous proposons ici d'introduire, l'aide de quelques exemples, les concepts importants d'ASP.NET. Cette introduction ne
permet pas de comprendre les subtilits des changes client / serveur d'une application web. Pour cela, on pourra lire d'anciens
documents qui dcrivent les changes Http entre un navigateur et un serveur web :
Cette introduction est faite pour ceux qui voudraient aller vite en acceptant, dans un premier temps, de laisser dans l'ombre des
points qui peuvent tre importants. Ce document peut tre ultrieurement approfondi par une tude de cas :
Construction d'une application trois couches avec ASP.NET, C#, Spring.net et Nhibernate
[http://tahe.developpez.com/dotnet/pam-aspnet/]
Les exemples ont t construits avec Visual Studio 2010 Professionnel. Des versions Express de Visual Studio 2010 sont
disponibles l'Url [http://msdn.microsoft.com/fr-fr/express/aa975050] (novembre 2011) et peuvent tre tlcharges librement.
On tlchargera ainsi Visual Web Developer Express 2010. Les copies d'cran de ce document sont celles de Visual Studio 2010
Professionnel . Elles pourront parfois diffrer des crans de Visual Studio 2010 Express mais le lecteur devrait s'y retrouver
nanmoins aisment.
Un projet exemple
2
1
en [4], on donne un nom l'application. Un dossier sera cr pour le projet avec ce nom.
en [5], on indique le dossier parent du dossier [4] du projet
http://tahe.developpez.com
2/46
8
6
7
en [6], le projet cr
[Web.config] est le fichier de configuration du projet ASP.NET.
[References] est la liste des Dll utilises par le projet web. Ces Dll sont des bibliothques de classes que le projet est amen
utiliser. En [7] la liste des Dll mises par dfaut dans les rfrences du projet. La plupart sont inutiles. Si le projet doit
utiliser une Dll non liste en [7], celle-ci peut tre ajoute par [8].
2
1
Si on excute le projet par [Ctrl-F5], la page [Default.aspx] est affiche dans un navigateur :
http://tahe.developpez.com
3/46
en [1], l'Url du projet web. Visual Studio a un serveur web intgr qui est lanc lorsqu'on demande l'excution d'un projet
web. Il coute sur un port alatoire, ici 57365. Le port d'coute est habituellement le port 80. En [1], aucune page n'est
demande. Dans ce cas, c'est la page [Default.aspx] qui est affiche, d'o son nom de page par dfaut.
en [2], la page [Default.aspx] est vide.
dans Visual Studio, la page [Default.aspx] [3] peut tre construite visuellement (onglet [Design]) ou l'aide de balises
(onglet [Source])
en [4], la page [Default.aspx] en mode [Design]. On la construit en y dposant des composants que l'on trouve dans la
bote outils [5]. Si cette bote n'est pas visible, on l'obtient par le menu [Affichage / Bote outils].
la ligne 1 est une directive ASP.NET qui liste certaines proprits de la page
la directive Page s'applique une page web. Il y a d'autres directives telles que Application, WebService, ... qui
s'applique d'autres objets ASP.NET
l'attribut AutoEventWireUp="true" indique que la liaison entre un vnement dans [Default.aspx] et son
gestionnaire dans [Defaul.aspx.cs] se fait par le nom de l'vnement. Ainsi l'vnement Load sur la page
[Default.aspx] sera trait par la mthode Page_Load de la classe Intro._Default dfinie par l'attribut Inherits.
les lignes 4-14 dcrivent la page [Default.aspx] l'aide de balises :
http://tahe.developpez.com
4/46
ASP.NET. Ce sont les balises qui ont l'attribut runat="server". Les balises ASP.NET sont traites par le serveur
web avant envoi de la page au client. Elles sont transformes en balises Html. Le navigateur client reoit donc
une page Html standard dans laquelle il n'existe plus de balises ASP.NET.
La page [Default.aspx] peut tre modifie directement partir de son code source. C'est parfois plus simple que de passer par le
mode [Design]. Nous modifions le code source de la faon suivante :
1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="Intro._Default" %>
2.
3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4. <html xmlns="http://www.w3.org/1999/xhtml">
5. <head runat="server">
6.
<title>Introduction ASP.NET</title>
7. </head>
8. <body>
9.
<h3>Introduction ASP.NET</h3>
10.
<form id="form1" runat="server">
11.
<div>
12.
</div>
13.
</form>
14. </body>
15. </html>
En ligne 6, nous donnons un titre la page grce la balise Html <title>. En ligne 9, nous introduisons un texte dans le corps
(<body>) de la page. Si nous excutons le projet (Ctrl-F5), nous obtenons le rsultat suivant dans le navigateur :
//-----------------------------------------------------------------------------// <auto-generated>
//
Ce code a t gnr par un outil.
//
Version du runtime :2.0.50727.3603
//
//
Les modifications apportes ce fichier peuvent provoquer un comportement incorrect et seront perdues si
//
le code est rgnr.
// </auto-generated>
//-----------------------------------------------------------------------------namespace Intro {
public partial class _Default {
///
///
///
///
///
///
<summary>
Contrle form1.
</summary>
<remarks>
Champ gnr automatiquement.
Pour modifier, dplacez la dclaration de champ du fichier de concepteur dans le fichier code-
behind.
22.
/// </remarks>
23.
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
24.
}
25. }
On trouve dans ce fichier la liste des composants ASP.NET de la page [Default.aspx] ayant un identifiant. Ils correspondent aux
balises de [Default.aspx] ayant l'attribut runat="server" et l'attribut id. Ainsi le composant de la ligne 23 ci-dessus correspond la
balise
http://tahe.developpez.com
5/46
de [Default.aspx].
Le dveloppeur interagit peu avec le fichier [Default.aspx.designer.cs]. Nanmoins ce fichier est utile pour connatre la classe d'un
composant particulier. Ainsi on voit ci-dessous que le composant form1 est de type HtmlForm. Le dveloppeur peut alors explorer
cette classe pour en connatre les proprits et mthodes. Les composants de la page [Default.aspx] sont utiliss par la classe du
fichier [Default.aspx.cs] :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
using
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.UI;
System.Web.UI.WebControls;
namespace Intro
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
On notera que la classe dfinie dans les fichiers [Default.aspx.cs] et [Default.aspx.designer.cs] est la mme (ligne 10) : Intro._Default.
C'est le mot cl partial qui rend possible d'tendre la dclaration d'une classe sur plusieurs fichiers, ici deux.
Ligne 10, ci-dessus, on voit que la classe [_Default] tend la classe [Page] et hrite de ses vnements. L'un d'entre-eux est
l'vnement Load qui se produit lorsque la page est charge par le serveur web. Ligne 12, la mthode Page_Load qui gre
l'vnement Load de la page. C'est gnralement ici qu'on initialise la page avant son affichage dans le navigateur du client. Ici, la
mthode Page_Load ne fait rien.
La classe associe une page web, ici la classe Intro._Default, est cre au dbut de la requte du client et dtruite lorsque la rponse
au client a t envoye. Elle ne peut donc servir mmoriser des informations entre deux requtes. Pour cela il faut utiliser la
notion de session utilisateur.
http://tahe.developpez.com
6/46
26.
<asp:TextBox ID="TextBoxAge" runat="server"></asp:TextBox>
27.
</td>
28.
<td>
29.
</td>
30.
</tr>
31.
</table>
32.
</div>
33.
<asp:Button ID="ButtonValider" runat="server" Text="Valider" />
34.
<hr />
35.
<p>
36.
Evnements traits par le serveur</p>
37.
<p>
38.
<asp:ListBox ID="ListBoxEvts" runat="server"></asp:ListBox>
39.
</p>
40.
</form>
41. </body>
42. </html>
Cette page peut tre obtenue en modifiant directement le code source de la page ou en dessinant la page en mode [Design]. On
trouvera les composants ncessaires dans la bote outils sous le thme Standard.
http://tahe.developpez.com
7/46
15.
16.
// on note l'vnement
ListBoxEvts.Items.Insert(0, string.Format("{0}: Page_Load",
DateTime.Now.ToString("hh:mm:ss")));
17.
}
18.
19.
protected void ButtonValider_Click(object sender, EventArgs e)
20.
{
21.
// on note l'vnement
22.
ListBoxEvts.Items.Insert(0, string.Format("{0}: ButtonValider_Click",
DateTime.Now.ToString("hh:mm:ss")));
23.
}
24.
}
25. }
La gestion de chacun de ces trois vnements consiste ajouter un message au composant Listbox nomm ListBoxEvts. Ce message
affiche l'heure de l'vnement et le nom de celui-ci. Chaque message est plac en dbut de liste. Aussi les messages placs en haut
de la liste sont les plus rcents.
Lorsqu'on excute le projet, on obtient la page suivante :
2
On voit en [1] que les vnements Page_Init et Page_Load se sont produits dans cet ordre. On rappelle que l'vnement le plus rcent
est en haut de la liste. Lorsque le navigateur demande la page [Default.aspx] directement par son Url [2], il le fait par une commande
HTTP (HyperText Transfer Protocol) appele GET. Une fois la page charge dans le navigateur, l'utilisateur va provoquer des
vnements sur la page. Par exemple il va cliquer sur le bouton [Valider] [3]. Les vnements provoqus par l'utilisateur une fois la
page charge dans le navigateur, dclenchent une requte la page [Default.aspx] mais cette fois-ci avec une commande HTTP
appele POST. Pour rsumer :
le chargement initial d'une page P dans un navigateur est faite par une opration HTTP GET
les vnements qui se produisent ensuite sur la page produisent chaque fois une nouvelle requte vers la mme page P
mais cette fois avec une commande HTTP POST. Il est possible pour une page P de savoir si elle a t demande avec
une commande GET ou une commande POST, ce qui lui permet de se comporter diffremment si c'est ncessaire, ce qui
est la plupart du temps le cas.
http://tahe.developpez.com
8/46
Navigateur
Serveur web
1
Page ASPX
Html
2
en [1], le navigateur demande la page ASPX via une commande HTTP GET sans paramtres.
en [2], le serveur web lui envoie en rponse le flux HTML traduction de la page ASPX demande.
Traitement d'un vnement produit sur la page affiche par le navigateur : POST
Navigateur
Serveur web
1
Page ASPX
Html
2
en [1], lors d'un vnement sur la page Html, le navigateur demande la page ASPX dj acquise avec une opration GET,
cette fois avec une commande HTTP POST accompagne de paramtres. Ces paramtres sont les valeurs des
composants qui se trouvent l'intrieur de la balise <form> de la page HTML affiche par le navigateur. On appelle ces
valeurs, les valeurs postes par le client. Elles vont tre exploites par la page ASPX pour traiter la demande du client.
en [2], le serveur web lui envoie en rponse le flux HTML traduction de la page ASPX demande initialement par le
POST ou bien d'une autre page s'il y a eu transfert de page ou redirection de page.
Si, ci-dessus, l'utilisateur clique sur le bouton [Valider] [3], la page [Default.aspx] va tre demande avec un POST. Ce POST sera
accompagn de paramtres qui seront les valeurs de tous les composants inclus dans la balise <form> de la page [Default.aspx] : les
deux TextBox [TextBoxNom, TextBoxAge], le bouton [ButtonValider], la liste [ListBoxEvts]. Les valeurs postes pour les
composants sont les suivantes :
http://tahe.developpez.com
9/46
En rponse du POST, on obtient la page [4]. C'est de nouveau la page [Default.aspx]. C'est le comportement normal, moins qu'il
y ait transfert ou redirection de page par les gestionnaires d'vnements de la page. On peut voir que deux nouveaux vnements se
sont produits :
l'vnement Page_Init ne s'est pas produit sur l'opration HTTP POST alors qu'il s'tait produit sur l'vnement HTTP
GET
l'vnement Page_Load se produit tout le temps, que ce soit sur un GET ou un POST. C'est dans cette mthode qu'on a en
gnral besoin de savoir si on a affaire un GET ou un POST.
l'issue du POST, la page [Default.aspx] a t renvoye au client avec les modifications apportes par les gestionnaires
d'vnements. C'est toujours ainsi. Une fois les vnements d'une page P traits, cette mme page P est renvoye au client.
Il y a deux faons d'chapper cette rgle. Le dernier gestionnaire d'vnement excut peut
l'vnement ButtonValider_Click s'est produit aprs l'vnement Page_Load. C'est donc ce gestionnaire qui peut prendre la
dcision du transfert ou de la redirection vers une page P2.
la liste des vnements [4] a gard les deux vnements affichs lors du chargement initial GET de la page [Default.aspx].
C'est surprenant lorsqu'on sait que la page [Default.aspx] a t recre lors du POST. On devrait retrouver la page
[Default.aspx] avec ses valeurs de conception avec donc un ListBox vide. L'excution des gestionnaires Page_Load et
ButtonValider_Click devrait y mettre ensuite deux messages. Or on en trouve quatre. C'est le mcanisme du VIEWSTATE
qui explique cela. Lors du GET initial, le serveur web envoie la page [Default.aspx] avec une balise HTML <input
type="hidden" ...> appel champ cach (ligne 10 ci-dessous).
1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2. <html xmlns="http://www.w3.org/1999/xhtml">
3. <head><title>
4.
Introduction ASP.NET
5. </title></head>
6. <body>
7.
<h3>Introduction ASP.NET</h3>
8.
<form name="form1" method="post" action="default.aspx" id="form1">
9. <div>
10. <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwUKLTMzMTEyNDMxMg9kFgICAw9kFgICBw8QZBAVAhMwNjoxNjozNjogUGFnZV9Mb2FkEzA2OjE2OjM2OiBQYWd
lX0luaXQVAhMwNjoxNjozNjogUGFnZV9Mb2FkEzA2OjE2OjM2OiBQYWdlX0luaXQUKwMCZ2dkZGRW1AnTL8f/q7h2MXBLxctKD
1UKfg==" />
11. </div>
12. ..............................
Dans le champ d'id "__VIEWSTATE" le serveur web met sous forme code la valeur de tous les composants de la page. Il le fait
aussi bien sur le GET initial que sur les POST qui suivent. Lorsqu'un POST sur une page P se produit :
le navigateur demande la page P en envoyant dans sa requte les valeurs de tous les composants qui sont l'intrieur de la
balise <form>. Ci-dessus, on peut voir que le composant "__VIEWSTATE" est l'intrieur de la balise <form>. Sa
valeur est donc envoye au serveur lors d'un POST.
la page P est instancie et initialise avec ses valeurs de construction
le composant "__VIEWSTATE" est ensuite utilis pour redonner aux composants les valeurs qu'ils avaient lorsque la
page P avait t envoye prcdemment. C'est ainsi par exemple, que la liste des vnements [4] retrouve les deux
premiers messages qu'elle avait lorsqu'elle a t envoye en rponse au GET initial du navigateur.
les composants de la page P prennent ensuite pour valeurs, les valeurs postes par le navigateur. A ce moment l, le
formulaire de la page P est dans l'tat o l'utilisateur l'a post.
l'vnement Page_Load est trait. Ici il rajoute un message la liste des vnements[4].
l'vnement qui a provoqu le POST est trait. Ici ButtonValider_Click rajoute un message la liste des vnements[4].
la page P est renvoye. Les composants ont pour valeur :
http://tahe.developpez.com
10/46
soit la valeur poste, c.a.d. la valeur que le composant avait dans le formulaire lorsque celui a t post au serveur
soit une valeur donne par l'un des gestionnaires d'vnements.
Dans notre exemple,
les deux composants TextBox retrouveront leur valeur poste car les gestionnaires d'vnements n'y touchent pas
la liste des vnements [4] retrouve sa valeur poste, c.a.d. tous les vnements dj inscrits dans la liste, plus
deux nouveaux vnements crs par les mthodes Page_Load et ButtonValider_Click.
Le mcanisme du VIEWSTATE peut tre activ ou inhib au niveau de chaque composant. Inhibons-le pour le composant
[ListBoxEvts] (clic droit sur ListBoxEvts / Proprits) :
1
3
en [1], le VIEWSTATE du composant [ListBoxEvts] est inhib. Celui des TextBox [2] est activ par dfaut.
en [3], les deux vnements renvoys aprs le GET initial
6
7
4
en [4], on a rempli le formulaire et on clique sur le bouton [Valider]. Un POST vers la page [Default.aspx] va tre fait.
en [6], le rsultat renvoy aprs un Clic sur le bouton [Valider]
le mcanisme du VIEWSTATE activ explique que les TextBox [7] aient gard leur valeur poste en [4]
le mcanisme du VIEWSTATE inhib explique que le composant [ListBoxEvts] [8] n'ait pas gard son contenu
[5].
http://tahe.developpez.com
11/46
Nous utiliserons le composant [LabelPost] pour afficher les valeurs saisies dans les deux TextBox [2]. Le code du gestionnaire
d'vnements [Default.aspx.cs] volue comme suit :
1. using System;
2.
3. namespace Intro
4. {
5.
public partial class _Default : System.Web.UI.Page
6.
{
7.
protected void Page_Init(object sender, EventArgs e)
8.
{
9.
// on note l'vnement
10.
ListBoxEvts.Items.Insert(0, string.Format("{0}: Page_Init",
DateTime.Now.ToString("hh:mm:ss")));
11.
}
12.
13.
protected void Page_Load(object sender, EventArgs e)
14.
{
15.
// on note l'vnement
16.
ListBoxEvts.Items.Insert(0, string.Format("{0}: Page_Load",
DateTime.Now.ToString("hh:mm:ss")));
17.
}
18.
19.
protected void ButtonValider_Click(object sender, EventArgs e)
20.
{
21.
// on note l'vnement
22.
ListBoxEvts.Items.Insert(0, string.Format("{0}: ButtonValider_Click",
DateTime.Now.ToString("hh:mm:ss")));
23.
// on affiche le nom et l'ge
24.
LabelPost.Text = string.Format("nom={0}, age={1}", TextBoxNom.Text.Trim(),
TextBoxAge.Text.Trim());
25.
}
26.
}
27. }
http://tahe.developpez.com
12/46
Comme il a t expliqu prcdemment, lorsque la mthode ButtonValider_Click est excute, les composants de la page ont la
valeur qu'ils avaient lorsque la page a t poste par l'utilisateur. Les proprits Text des deux TextBox ont donc pour valeur les
textes saisis par l'utilisateur dans le navigateur.
Voici un exemple :
3
1
On voit ci-dessus que la valeur poste pour l'ge est la chane "yy", une valeur illgale. Nous allons rajouter la page des
composants appels validateurs. Ils servent vrifier la validit de donnes postes. Cette validit peut tre vrifie deux endroits
:
sur le client. Une option de configuration du validateur permet de demander ou non que les tests soient faits sur le
navigateur. Ils sont alors faits par du code JavaScript embarqu dans la page Html. Lorsque l'utilisateur fait un POST des
valeurs saisies dans le formulaire, celles-ci sont tout d'abord vrifies par le code Javascript. Si l'un des tests choue, le
POST n'est pas effectu. On vite ainsi un aller-retour avec le serveur rendant ainsi la page plus ractive.
sur le serveur. Si les tests ct client peuvent tre facultatifs, ct serveur ils sont obligatoires qu'il y ait eu vrification ou
non ct client. En effet, lorsqu'une page reoit des valeurs postes, elle n'a pas possibilit de savoir si elles ont t
vrifies par le client avant leur envoi. Ct serveur, le dveloppeur doit donc toujours vrifier la validit des donnes
postes.
http://tahe.developpez.com
13/46
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
<title>Introduction ASP.NET</title>
</head>
<body>
<h3>Introduction ASP.NET</h3>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td>
Nom</td>
<td>
<asp:TextBox ID="TextBoxNom" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidatorNom" runat="server"
ControlToValidate="TextBoxNom" Display="Dynamic"
ErrorMessage="Donne obligatoire !"></asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
Age</td>
<td>
<asp:TextBox ID="TextBoxAge" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidatorAge" runat="server"
ControlToValidate="TextBoxAge" Display="Dynamic"
ErrorMessage="Donne obligatoire !"></asp:RequiredFieldValidator>
<asp:RangeValidator ID="RangeValidatorAge" runat="server"
ControlToValidate="TextBoxAge" Display="Dynamic"
ErrorMessage="Tapez un nombre entre 1 et 150 !" MaximumValue="150"
MinimumValue="1" Type="Integer"></asp:RangeValidator>
</td>
</tr>
</table>
</div>
<asp:Button ID="ButtonValider" runat="server" onclick="ButtonValider_Click"
Text="Valider" CausesValidation="False"/>
<hr />
<p>
Evnements traits par le serveur</p>
<p>
<asp:ListBox ID="ListBoxEvts" runat="server" EnableViewState="False">
</asp:ListBox>
</p>
<p>
Elments posts au serveur :
<asp:Label ID="LabelPost" runat="server"></asp:Label>
</p>
<p>
Elments valids par le serveur :
<asp:Label ID="LabelValidation" runat="server"></asp:Label>
</p>
<asp:Label ID="LabelErreursSaisie" runat="server" ForeColor="Red"></asp:Label>
</form>
</body>
</html>
Les validateurs ont t rajouts aux lignes 20, 32 et 35. Ligne 58, un composant Label est utilis pour afficher les valeurs postes
valides. Ligne 60, un un composant Label est utilis pour afficher un message d'erreur s'il y a des erreurs de saisie.
La page [Default.aspx] peut tre galement construite en mode [Design]. Les nouveaux composants peuvent tre trouvs dans la
bote outils sous le thme Validation.
http://tahe.developpez.com
14/46
les composants [1] et [2] sont de type RequiredFieldValidator. Ce validateur vrifie qu'un champ de saisie est non vide.
le composant [3] est de type RangeValidator. Ce validateur vrifie qu'un champ de saisie contient une valeur entre deux
bornes.
en [4], les proprits du validateur [1].
Nous allons prsenter les deux types de validateurs au travers de leurs balises dans le code de la page [Default.aspx] :
<asp:RequiredFieldValidator ID="RequiredFieldValidatorNom" runat="server"
ControlToValidate="TextBoxNom" Display="Dynamic"
ErrorMessage="Donne obligatoire !"></asp:RequiredFieldValidator>
ID : l'identifiant du composant
ControlToValidate : le nom du composant dont la valeur est vrifie. Ici on veut que le composant TextBoxNom n'ait pas
une valeur vide (chane vide ou suite d'espaces)
ErrorMessage : message d'erreur afficher dans le validateur en cas de donne invalide.
EnableClientScript : boolen indiquant si le validateur doit tre excut galement ct client. Cet attribut a la valeur
True par dfaut lorsqu'il n'est pas explicitement positionn comme ci-dessus.
Display : mode d'affichage du validateur. Il y a deux modes :
static (dfaut) : le validateur occupe de la place sur la page mme s'il n'affiche pas de message d'erreur
dynamic : le validateur n'occupe pas de place sur la page s'il n'affiche pas de message d'erreur.
<asp:RangeValidator ID="RangeValidatorAge" runat="server"
ControlToValidate="TextBoxAge" Display="Dynamic"
ErrorMessage="Tapez un nombre entre 1 et 150 !" MaximumValue="150"
MinimumValue="1" Type="Integer"></asp:RangeValidator>
La configuration du composant qui provoque le POST joue un rle dans le mode de validation. Ici ce composant est le bouton
[Valider] :
<asp:Button ID="ButtonValider" runat="server" onclick="ButtonValider_Click"
CausesValidation="True" />
Text="Valider"
CausesValidation : fixe le mode automatique ou nom des validations ct serveur. Cet attribut a la valeur par dfaut
"True" s'il n'est pas explicitement mentionn. Dans ce cas,
ct client, les validateurs ayant EnableClientScript True sont excuts. Le POST n'a lieu que si tous les validateurs
ct client russissent.
http://tahe.developpez.com
15/46
ct serveur, tous les validateurs prsents sur la page sont automatiquement excuts avant le traitement de
l'vnement qui a provoqu le POST. Ici, ils seraient excuts avant l'excution de la mthode
ButtonValider_Click. Dans cette mthode, il est possible de savoir si toutes les validations ont russi ou non.
Page.IsValid est "True" si elles ont toutes russi, "False" sinon. Dans ce dernier cas, on peut arrter le
traitement de l'vnement qui a provoqu le POST. La page poste est renvoye telle qu'elle a t saisie. Les
validateurs ayant chou affichent alors leur message d'erreur (attribut ErrorMessage).
Si CausesValidation a la valeur False, alors
ct serveur, c'est au dveloppeur de demander lui-mme l'excution des validateurs de la page. Il le fait avec la
mthode Page.Validate(). Selon le rsultat des validations, cette mthode positionne la proprit Page.IsValid
"True" ou "False".
Dans [Default.aspx.cs] le code de traitement de ButtonValider_Click volue comme suit :
1. protected void ButtonValider_Click(object sender, EventArgs e)
2.
{
3.
// on note l'vnement
4.
ListBoxEvts.Items.Insert(0, string.Format("{0}: ButtonValider_Click",
DateTime.Now.ToString("hh:mm:ss")));
5.
// on affiche le nom et l'ge
6.
LabelPost.Text = string.Format("nom={0}, age={1}", TextBoxNom.Text.Trim(),
TextBoxAge.Text.Trim());
7.
// la page est-elle valide ?
8.
Page.Validate();
9.
if (!Page.IsValid)
10.
{
11.
// msg d'erreur global
12.
LabelErreursSaisie.Text = "Veuillez corriger les erreurs de saisie...";
13.
LabelErreursSaisie.Visible = true;
14.
return;
15.
}
16.
// on cache le msg d'erreur
17.
LabelErreursSaisie.Visible = false;
18.
// on affiche le nom et l'ge valids
19.
LabelValidation.Text = string.Format("nom={0}, age={1}", TextBoxNom.Text.Trim(),
TextBoxAge.Text.Trim());
20. }
Dans le cas o le bouton [Valider] a son attribut CausesValidation True et les validateurs leur attribut EnableClientScript True, la
mthode ButtonValider_Click n'est excute que lorsque les valeurs postes sont valides. On peut se demander alors le sens du code
que l'on trouve partir de la ligne 8. Il faut alors se rappeler qu'il est toujours possible d'crire un client programm qui poste des
valeurs non vrifies la page [Default.aspx]. Donc celle-ci doit toujours refaire les tests de validit.
ligne 8 : lance l'excution de tous les validateurs de la page. Dans le cas o le bouton [Valider] a son attribut
CausesValidation True, ceci est fait automatiquement et il n'y a pas lieu de le refaire. Il y a ici redondance.
lignes 9-15 : cas o l'un des validateurs a chou
lignes 16-19 : cas o tous les validateurs ont russi
http://tahe.developpez.com
16/46
9
10
http://tahe.developpez.com
17/46
en [8] un exemple obtenu avec des donnes valides. [9,10] montrent que les lments posts ont t valids. Lorsqu'on fait
des tests rpts, il faut mettre False la proprit EnableViewState du label [LabelValidation] afin que le message de
validation ne reste pas affich au fil des excutions.
Navigateur
Serveur web
1
Page ASPX
Html
2
La classe de la page ASPX est instancie au dbut de la requte du client et dtruite la la fin de celle-ci. Aussi elle ne peut servir
mmoriser des donnes entre deux requtes. On peut vouloir mmoriser deux types de donnes :
des donnes partages par tous les utilisateurs de l'application web. Ce sont en gnral des donnes en lecture seule. Trois
fichiers sont utiliss pour mettre en oeuvre ce partage de donnes :
[Global.asax, Global.asax.cs] : permettent de dfinir une classe, appele classe globale d'application, dont la dure
de vie est celle de l'application, ainsi que des gestionnaires pour certains vnements de cette mme application.
La classe globale d'application permet de dfinir des donnes qui seront disponibles pour toutes les requtes de tous les
utilisateurs.
des donnes partages par les requtes d'un mme client. Ces donnes sont mmorises dans un objet appele Session.
On parle alors de session client pour dsigner la mmoire du client. Toutes les requtes d'un client ont accs cette
session. Elles peuvent y stocker et y lire des informations
Navigateur
Serveur web
Mmoire
Application
Page ASPX
Mmoire
Session
Html
2
Ci-dessus, nous montrons les types de mmoire auxquels a accs une page ASPX :
la mmoire de l'application qui contient la plupart du temps des donnes en lecture seule et qui est accessible tous les
utilisateurs.
la mmoire d'un utilisateur particulier, ou session, qui contient des donnes en lecture / criture et qui est accessible aux
requtes successives d'un mme utilisateur.
non reprsente ci-dessus, il existe une mmoire de requte, ou contexte de requte. La requte d'un utilisateur peut tre
traite par plusieurs pages ASPX successives. Le contexte de la requte permet une page 1 de transmettre de
l'information une page 2.
Nous nous intressons ici aux donnes de porte Application, celles qui sont partages par tous les utilisateurs. La classe globale de
l'application peut tre cre comme suit :
http://tahe.developpez.com
18/46
2
1
la balise Application remplace la balise Page qu'on avait pour [Default.aspx]. Elle identifie la classe d'application globale
Codebehind : dfinit le fichier dans lequel est dfinie la classe d'application globale
Inherits : dfinit le nom de cette classe
http://tahe.developpez.com
19/46
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
}
43. }
{
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
}
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
}
protected void Application_Error(object sender, EventArgs e)
{
}
protected void Session_End(object sender, EventArgs e)
{
}
protected void Application_End(object sender, EventArgs e)
{
}
lignes 8, 38 : grent les vnements Application_Start (dmarrage de l'application) et Application_End (fin de l'application
lorsque le serveur web s'arrte ou lorsque l'administrateur dcharge l'application)
lignes 13, 33 : grent les vnements Session_Start (dmarrage d'une nouvelle session client l'arrive d'un nouveau client
ou l'expiration d'une session existante) et Session_End (fin d'une session client soit explicitement par programmation soit
implicitement par dpassement de la dure autorise pour une session).
ligne 28 : gre l'vnement Application_Error (apparition d'une exception non gre par le code de l'application et remonte
jusqu'au serveur)
ligne 18 : gre l'vnement Application_BeginRequest (arrive d'une nouvelle requte).
ligne 23 : gre l'vnement Application_AuhenticateRequest (se produit lorsqu'un utilisateur s'est authentifi).
La mthode [Application_Start] est souvent utilise pour initialiser l'application partir d'informations contenues dans
[Web.Config]. Celui gnr la cration initiale d'un projet a l'allure suivante :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Pour notre application actuelle, ce fichier est inutile. Si on le supprime ou le renomme, l'application continue fonctionner
normalement. Lorsqu'il a t dtruit, on peut le rgnrer de la faon suivante : clic droit sur projet Ajouter / Nouvel lment /
Fichier de configuration web.
Nous allons faire voluer le fichier [Web.config] de la faon suivante :
1. <?xml version="1.0" encoding="utf-8"?>
2.
3. <!-4.
Pour plus d'informations sur la configuration de votre application ASP.NET, consultez
http://tahe.developpez.com
20/46
5.
http://go.microsoft.com/fwlink/?LinkId=169433
6.
-->
7.
8. <configuration>
9.
<system.web>
10.
<compilation debug="true" targetFramework="4.0" />
11.
</system.web>
12.
<appSettings>
13.
<add key="cle1" value="valeur1"/>
14.
<add key="cle2" value="valeur2"/>
15.
</appSettings>
16.
<connectionStrings>
17.
<add connectionString="connexion1" name="conn1"/>
18.
</connectionStrings>
19. </configuration>
Ce fichier peut tre exploit par la classe globale d'application suivante [Global.asax.cs] :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
using System;
using System.Configuration;
lignes 8-11 : quatre proprits statiques P. Comme la dure de vie de la classe Global est celle de l'application, toute requte
faite l'application aura accs ces proprits P via la syntaxe Global.P.
lignes 17-19 : le fichier [Web.config] est accessible via la classe [System.Configuration.ConfigurationManager]
lignes 17-18 : rcupre les lments de la balise <appSettings> du fichier [Web.config] via l'attribut key.
ligne 19 : rcupre les lments de la balise <connectionStrings> du fichier [Web.config] via l'attribut name.
namespace Intro
{
public class Global : System.Web.HttpApplication
{
public static string Param1 { get; set; }
public static string Param2 { get; set; }
public static string ConnString1 { get; set; }
public static string Erreur { get; set; }
protected void Application_Start(object sender, EventArgs e)
{
try
{
Param1 = ConfigurationManager.AppSettings["cle1"];
Param2 = ConfigurationManager.AppSettings["cle2"];
ConnString1 = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;
}
catch (Exception ex)
{
Erreur = string.Format("Erreur de configuration : {0}", ex.Message);
}
}
protected void Session_Start(object sender, EventArgs e)
{
}
}
}
Les attributs statiques des lignes 8-11 sont accessibles de n'importe quel gestionnaire d'vnement des pages ASPX charges. Nous
les utilisons dans le gestionnaire [Page_Load] de la page [Default.aspx] :
1.
2.
3.
4.
5.
6.
7.
http://tahe.developpez.com
21/46
ligne 6 : les quatre attributs statiques de la classe globale d'application sont utiliss pour alimenter un nouveau label de la
page [Default.aspx]
Ci-dessus, nous voyons que les paramtres de [Web.config] ont t correctement rcuprs. La classe globale d'application est le
bon endroit pour stocker des informations partages par tous les utilisateurs.
http://tahe.developpez.com
22/46
Navigateur
Serveur web
1
Page ASPX
Html
2
Mmoire
Application
Mmoire
Utilisateur 1
Mmoire
Utilisateur 2
lors de la premire requte d'un utilisateur, le serveur web cre un jeton de session qu'il attribue l'utilisateur. Ce jeton est
une suite de caractres unique pour chaque utilisateur. Il est envoy par le serveur dans la rponse faite la premire
requte de l'utilisateur.
lors des requtes suivantes, l'utilisateur (le navigateur web) inclut dans sa requte le jeton de session qu'on lui a attribu.
Aussi le serveur web est-il capable de le reconnatre.
une session a une dure de vie. Lorsque le serveur web reoit une requte d'un utilisateur, il calcule le temps qui s'est
coul depuis la requte prcdente. Si ce temps dpasse la dure de vie de la session, une nouvelle session est cre pour
l'utilisateur. Les donnes de la prcdente session sont perdues. Avec le serveur web IIS (Internet Information Server) de
Microsoft, les sessions ont par dfaut une dure de vie de 20 mn. Cette valeur peut tre change par l'administrateur du
serveur web.
le serveur web sait qu'il a affaire la premire requte d'un utilisateur parce que cette requte ne comporte pas de jeton de
session. C'est la seule.
Toute page ASP.NET a accs la session de l'utilisateur via la proprit Session de la page, de type
[System.Web.SessionState.HttpSessionState]. Nous utiliserons les proprits P et mthodes M suivantes de la classe
HttpSessionState :
Nom
Type
Item[String cl]
Clear
Abandon
Rle
La session peut tre construite comme un dictionnaire. Item[cl] est l'lment de la session identifi par
cl. Au lieu d'crire [HttpSessionState].Item[cl], on peut galement crire [HttpSessionState].[cl].
vide le dictionnaire de la session
termine la session. La session n'est alors plus valide. Une nouvelle session dmarrera avec la
prochaine requte de l'utilisateur.
Comme exemple de mmoire utilisateur, nous allons compter le nombre de fois qu'un utilisateur clique sur le bouton [Valider].
Pour obtenir ce rsultat, il faut maintenir un compteur dans la session de l'utilisateur.
La page [Default.aspx] volue comme suit :
http://tahe.developpez.com
23/46
using System;
using System.Configuration;
namespace Intro
{
public class Global : System.Web.HttpApplication
{
public static string Param1 { get; set; }
...
...
Ligne 19, on utilise la session de l'utilisateur pour y stocker un compteur de requtes identifi par la cl "nbRequtes". Ce compteur
est mis jour par le gestionnaire [ButtonValider_Click] de la page [Default.aspx] :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using System;
namespace Intro
{
public partial class _Default : System.Web.UI.Page
{
....
http://tahe.developpez.com
24/46
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
la requte initiale du navigateur faite avec une commande HTTP GET. Le serveur rpond en envoyant la page demande.
Nous supposerons que cette page est un formulaire, c.a.d. que dans la page ASPX envoye, il y a une balise <form
runat="server"...>.
les requtes suivantes faites par le navigateur en raction certaines actions de l'utilisateur sur le formulaire. Le navigateur
fait alors une requte HTTP POST.
Que ce soit sur une demande GET ou une demande POST, la mthode [Page_Load] est excute. Lors du GET, cette mthode est
habituellement utilise pour initialiser la page envoye au navigateur client. Ensuite, par le mcanisme du VIEWSTATE, la page
reste initialise et n'est modifie que par les gestionnaires des vnements qui provoquent les POST. Il n'y a pas lieu de rinitialiser
la page dans Page_Load. D'o le besoin pour cette mthode de savoir si la requte du client est un GET (la premire requte) ou un
POST (les suivantes).
http://tahe.developpez.com
25/46
Examinons l'exemple suivant. On ajoute une liste droulante la page [Default.aspx]. Le contenu de cette liste sera dfini dans le
gestionnaire Page_Load de la requte GET :
Rle
Type
Items
SelectedIndex P
l'index, partant de 0, de l'lment slectionn dans la liste droulante lorsque le formulaire est post
SelectedItem
l'lment de type ListItem slectionn dans la liste droulante lorsque le formulaire est post
SelectedValue P
la valeur de type string de l'lment de type ListItem slectionn dans la liste droulante lorsque le formulaire
est post. Nous allons dfinir prochainement cette notion de valeur.
La classe ListItem des lments d'une liste droulante sert gnrer les balises <option> de la balise Html <select> :
1. <select ....>
2.
<option value="val1">texte1</option>
3.
<option value="val2">texte2</option>
4. ....
5. </select>
vali est la valeur poste par le navigateur si textei est le texte slectionn dans la liste droulante
Chaque option peut tre gnre par un objet ListItem construit l'aide du constructeur ListItem(string texte, string valeur).
Dans [Default.aspx.cs], le code du gestionnaire [Page_Load] volue comme suit :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15. }
ligne 8 : la classe Page a un attribut IsPostBack de type boolen. A vrai, il signifie que la requte de l'utilisateur est un POST.
Les lignes 10-13 ne sont donc excutes que sur le GET initial du client.
http://tahe.developpez.com
26/46
ligne 12 : on ajoute la liste [DropDownListNoms], un lment de type ListItem(string texte, string value). Le texte affich
pour le (i+1)me lment sera nomi et la valeur poste pour cet lment s'il est slectionn sera i.
Le gestionnaire [ButtonValider_Click] est modifi afin d'afficher la valeur poste par la liste droulante :
1.
protected void ButtonValider_Click(object sender, EventArgs e)
2.
{
3.
// on note l'vnement
4. ...
5.
// on affiche les valeurs postes
6.
LabelPost.Text = string.Format("nom={0}, age={1}, combo={2}", TextBoxNom.Text.Trim(),
TextBoxAge.Text.Trim(), DropDownListNoms.SelectedValue);
7.
// nombre de requtes
8. ...
9. }
Ligne 6, la valeur poste pour la liste [DropDownListNoms] est obtenue avec la proprit SelectedValue de la liste. Voici un exemple
d'excution :
1
2
4
3
en [1], le contenu de la liste droulante aprs le GET initial et juste avant le 1er POST
en [2], la page aprs le 1er POST.
en [3], la valeur poste pour la liste droulante. Correspond l'attribut value du ListItem slectionn dans la liste.
en [4], la liste droulante. Elle contient les mmes lments qu'aprs le GET initial. C'est le mcanisme du VIEWSTATE
qui explique cela.
Pour comprendre l'interaction entre le VIEWSTATE de la liste DropDownListNoms et le test if (! IsPostBack) du gestionnaire
Page_Load de [Default.aspx], le lecteur est invit refaire le test prcdent avec les configurations suivantes :
Cas DropDownListNoms.EnableViewState test if(! IsPostBack) dans Page_Load de [Default.aspx]
1
true
prsent
false
prsent
true
absent
false
absent
http://tahe.developpez.com
27/46
la page ASPX est instancie. Les composants sont initialiss avec leurs valeurs de conception.
la valeur __VIEWSTATE poste par le navigateur est utilise pour donner aux composants la valeur qu'ils avaient lorsque
la page ASPX a t envoye au navigateur la fois prcdente.
les valeurs postes par le navigateur sont affectes aux composants
les gestionnaires d'vnements sont excuts. Ils peuvent modifier la valeur de certains composants.
De cette squence, on dduit que les composants qui ont leur valeur :
poste
modifie par un gestionnaire d'vnement
peuvent avoir leur proprit EnableViewState Faux puisque leur valeur de VIEWSTATE (tape 2) va tre modifie par l'une des
tapes 3 ou 4.
La liste des composants de notre page est disponible dans [Default.aspx.designer.cs] :
1. namespace Intro {
2.
public partial class _Default {
3.
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
4.
protected global::System.Web.UI.WebControls.TextBox TextBoxNom;
5.
protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidatorNom;
6.
protected global::System.Web.UI.WebControls.TextBox TextBoxAge;
7.
protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidatorAge;
8.
protected global::System.Web.UI.WebControls.RangeValidator RangeValidatorAge;
9.
protected global::System.Web.UI.WebControls.DropDownList DropDownListNoms;
10.
protected global::System.Web.UI.WebControls.Button ButtonValider;
11.
protected global::System.Web.UI.WebControls.ListBox ListBoxEvts;
12.
protected global::System.Web.UI.WebControls.Label LabelPost;
13.
protected global::System.Web.UI.WebControls.Label LabelValidation;
14.
protected global::System.Web.UI.WebControls.Label LabelErreursSaisie;
15.
protected global::System.Web.UI.WebControls.Label LabelGlobal;
16.
protected global::System.Web.UI.WebControls.Label LabelNbRequetes;
17.
}
18. }
Valeur poste
TextBoxNom
TextBoxAge
idem
RequiredFieldValidatorNom
aucune
RequiredFieldValidatorAge
idem
RangeValidatorAge
idem
http://tahe.developpez.com
EnableViewState
Pourquoi
False
False
28/46
Composant
Valeur poste
Pourquoi
EnableViewState
False
LabelNbRequetes
idem
DropDownListNoms
ListBoxEvts
ButtonValider
libell du bouton
LabelPost
aucune
LabelValidation
idem
LabelErreursSaisie
idem
LabelGlobal
idem
False
Navigateur
Serveur web
1
[Default.aspx]
[Page1.aspx]
Html
2
Mmoire de la requte
Nous construisons la page [Page1.aspx]. Pour cela, on suivra la mthode utilise pour construire la page [Default.aspx] page 3.
http://tahe.developpez.com
29/46
ligne 13 : un label qui servira afficher une information transmise par la page [Default.aspx]
ligne 15 : un lien Html vers la page [Default.aspx]. Lorsque l'utilisateur clique sur ce lien, le navigateur demande la page
[Default.aspx] avec une opration GET. La page [Default.aspx] est alors charge comme si l'utilisateur avait tap
directement son Url dans son navigateur.
CausesValidation="False" : le clic sur le lien va provoquer un POST vers [Default.aspx]. Le composant [LinkButton] se
comporte comme le composant [Button]. Ici, on ne veut pas que le clic sur le lien dclenche l'excution des validateurs.
EnableViewState="False" : il n'y a pas lieu de conserver l'tat du lien au fil des requtes. Il garde ses valeurs de
conception.
onclick="LinkButtonToPage1_Click" : nom de la mthode qui, dans [Defaul.aspx.cs], gre l'vnement Click sur le
composant LinkButtonToPage1.
Ligne 7, la requte est passe la page [Page1.aspx] au moyen de la mthode [Server.Transfer]. Le deuxime paramtre de la
mthode qui est true indique qu'il faut passer [Page1.aspx] toute l'information qui a t envoye [Default.aspx] lors du POST.
Cela permet par exemple [Page1.aspx] d'avoir accs aux valeurs postes via une collection appele Request.Form. La ligne 5 utilise
http://tahe.developpez.com
30/46
ce qu'on appelle le contexte de la requte. On y a accs via la proprit Context de la classe Page. Ce contexte peut servir de mmoire
entre les diffrentes pages qui traitent la mme requte, ici [Default.aspx] et [Page1.aspx]. On utilise pour cela le dictionnaire Items.
Lorsque [Page1.aspx] est charge par l'opration Server.Transfer("Page1.aspx",true), tout se passe comme si [Page1.aspx] avait t
appele par un GET d'un navigateur. Le gestionnaire Page_Load de [Page1.aspx] est excut normalement. Nous l'utiliserons pour
afficher le message mis par [Default.aspx] dans le contexte de la requte :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using System;
namespace Intro
{
public partial class Page1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Context.Items["msg1"] as string;
}
}
}
Ligne 9, le message mis par [Default.aspx] dans le contexte de la requte, est affich dans Label1.
Voici un exemple d'excution :
1
5
3
4
dans la page [Default.aspx] [1], on clique sur le lien [2] qui nous mne vers la page Page1
en [3], la page Page1 est affiche
en [4], le message cr dans [Default.aspx] et affich par [Page1.aspx]
en [5], l'Url affiche dans le navigateur est celle de la page [Default.aspx]
Navigateur
Html
2
Html
http://tahe.developpez.com
Serveur web
[Default.aspx]
Session
Utilisateur
[Page2.aspx]
31/46
en [1], le navigateur fait une requte POST la page [Default.aspx]. Celle-ci traite la requte et envoie une rponse dite de
redirection au navigateur. Cette rponse est un simple flux HTTP (des lignes de texte) demandant au navigateur de se
rediriger vers une autre Url [Page2.aspx]. [Default.aspx] n'envoie pas de flux Html dans cette premire rponse.
en [2], le navigateur fait une requte GET la page [Page2.aspx]. Celle-ci est alors envoye en rponse au navigateur.
si la page [Default.aspx] souhaite transmettre des informations la page [Page2.aspx], elle peut le faire via la session de
l'utilisateur. Contrairement la mthode prcdente, le contexte de la requte n'est pas utilisable ici, car il y a ici deux
requtes distinctes donc deux contextes distincts. Il faut alors utiliser la session de l'utilisateur pour faire communiquer les
pages ensemble.
4
1
C'est le gestionnaire [LinkButtonToPage2_Click] qui assure la redirection vers [Page2.aspx]. Son code dans [Default.aspx.cs] est le
suivant :
http://tahe.developpez.com
32/46
1.
2.
3.
4.
5.
6.
7. }
Lorsque le navigateur va recevoir l'ordre de redirection vers [Page2.aspx], il va faire un GET sur cette page. Dans celle-ci, la
mthode [Page_Load] va s'excuter. On va l'utiliser pour rcuprer le message mis par [Default.aspx] dans la session et afficher
celui-ci. Le code [Page2.aspx.cs] est le suivant :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
using System;
namespace Intro
{
public partial class Page2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// on affiche le msg mis dans la session par [Default.aspx]
Label1.Text = Session["msg2"] as string;
}
}
}
en [1], on clique sur le lien de redirection de [Default.aspx]. Un POST est fait vers la page [Default.aspx]
en [2], le navigateur a t redirig vers [Page2.aspx]. Cela se voit l'Url affiche par le navigateur. Dans la mthode
prcdente, cette Url tait celle de [Default.aspx] car l'unique requte faite par le navigateur l'tait vers cette Url. Ici il y a
un premier POST vers [Default.aspx], puis l'insu de l'utilisateur un second GET vers [Page2.aspx].
en [3], on voit que [Page2.aspx] a correctement rcupr le message mis par [Default.aspx] dans la session.
2.12 Conclusion
Nous avons introduit, l'aide de quelques exemples, des concepts d'ASP.NET importants :
http://tahe.developpez.com
33/46
Nous souhaitons construire une application web dont toutes pages auraient la forme suivante :
2
4
3
Les zones 1-3 restent toujours les mmes. La zone 4 affiche diffrentes pages ASPX.
Nous construisons le projet suivant :
3
1
2
http://tahe.developpez.com
34/46
[Site1.Master] est la page matre qu'on peut construire comme les pages ASPX normales.
[Site1.Master.cs] contient le code C# de traitement des vnements de la page matre
[Site1.Master.Deigner.cs] contient la dclaration des composants ASP utiliss par la page matre.
http://tahe.developpez.com
35/46
18.
</form>
19. </body>
20. </html>
Nous ne commentons que les nouveauts par rapport une page ASPX classique :
Nous avons limin les deux conteneurs. Puis avec le curseur sur la ligne 10, nous insrons une table Html (bote outils / Html).
Le code volue de la faon suivante :
1. <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs"
Inherits="Intro_02.Site1" %>
2.
3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4. <html xmlns="http://www.w3.org/1999/xhtml">
5. <head runat="server">
6.
<title>Page Matre</title>
7. </head>
8. <body>
9.
<form id="form1" runat="server">
10.
<table style="width: 100%;">
11.
<tr>
12.
<td>
13.
14.
</td>
15.
<td>
16.
17.
</td>
18.
<td>
19.
20.
</td>
21.
</tr>
22.
<tr>
23.
<td>
24.
25.
</td>
26.
<td>
27.
28.
</td>
29.
<td>
30.
31.
</td>
32.
</tr>
33.
<tr>
34.
<td>
35.
36.
</td>
37.
<td>
38.
39.
</td>
http://tahe.developpez.com
36/46
40.
<td>
41.
42.
</td>
43.
</tr>
44.
</table>
45.
</form>
46. </body>
47. </html>
Nous avons un tableau 3 lignes et 3 colonnes [1]. Nous construisons partir de l, la page [2] construite avec un tableau de 3
lignes et 2 colonnes. Pour cela, nous :
supprimons une colonne : clic droit sur la colonne / Supprimer / les colonnes
fusionnons les cellules de la 1re puis de la 3ime ligne : slectionner les cellules fusionner / clic droit / Modifier /
Fusionner les cellules
donnons la cellule (2,1) Menu, la largeur de 500 px.
donnons chaque cellule, une couleur de fond pour les diffrencier : proprit bgcolor de la cellule.
Les pages ASPX utilisant cette page matre s'afficheront dans la cellule (2,2). Pour cela, il nous faut mettre dans cette cellule un
conteneur : slection de la cellule / bote outils / Standard / ContentPlaceHolder. La page matre volue ainsi :
mode [Design] :
mode [Source] :
http://tahe.developpez.com
37/46
Nous avons dsormais la page matre. Nous allons construire maintenant une premire page ASPX utilisant cette page matre.
http://tahe.developpez.com
38/46
5
6
ligne 1 : l'attribut MasterPageFile indique que la page [Default.aspx] s'insre dans la page matre [Site1.Master]. Le signe ~
dsigne le dossier de la page [Default.aspx].
ligne 2 : la balise <asp:Content> sert insrer du code ASP/Html dans un des conteneurs de la page matre. Celui-ci est
dsign par l'attribut ContentPlaceHolderID. La valeur de cet attribut doit tre l'ID d'un des conteneurs de la page matre. Si
nous revenons au code de celle-ci :
1.
2.
3.
4. </td>
<td bgcolor="#99CCFF">
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
Nous ne pouvons dposer des composants que dans le conteneur [1]. Nous faisons voluer la page pour obtenir [2].
Nous rptons l'opration respectivement pour les pages [Page2.aspx] [3] et [Default.aspx] [4] :
http://tahe.developpez.com
39/46
Si nous excutons le projet maintenant (Ctrl-F5), nous obtenons la page [Default.aspx] [4]. Afin de pouvoir naviguer entre les
pages, nous allons ajouter un composant [Menu] dans la cellule (2,1) de la page matre.
en [1], le composant [Menu] est trouv dans bote Outils / Navigation / Menu. Ce menu est aliment par une source de
donnes statique ou dynamique. Nous allons crer une souce statique pour naviguer entre les trois pages : Default.aspx,
Page1.aspx, Page2.aspx.
Dans les proprits [2] du menu, nous choisissons la proprit [DataSourceId] [3] puis l'option <Nouvelle source de donnes> :
http://tahe.developpez.com
40/46
1
2
La balise <siteMapNode> va servir dfinir une option du menu. L'imbrication des balises sera reflte par une imbrication des
options de menu. La balise <siteMapNode> a deux attributs obligatoires :
url : url de la page vers laquelle on doit naviguer lorsque l'option est clique
Nous faisons voluer le fichier prcdent comme suit :
http://tahe.developpez.com
41/46
Le composant [Menu] peut tre mis en forme [2]. Plusieurs options de mise en forme sont proposes [3].
Le projet peut tre excut (Ctrl-F5). Cette fois-ci le menu permet de naviguer entre les pages Default.aspx, Page1.aspx et
Page2.aspx. Ces pages partagent toutes l'architecture de la page matre.
1
Chaque page insre dans la page matre peut tre aussi complexe que la page tudie au dbut de ce document. Pour le montrer,
nous ajoutons des liens de navigation dans les pages [Page1.aspx] et [Page2.aspx].
[Page1.aspx] Mode [Design]
http://tahe.developpez.com
42/46
http://tahe.developpez.com
43/46
Conclusion
Construction d'une application trois couches avec ASP.NET, C#, Spring.net et Nhibernate
[http://tahe.developpez.com/dotnet/pam-aspnet/]
http://tahe.developpez.com
44/46
Application [simupaie]
3 - couche [ui]
1
Utilisateur
Application
2couche
[mtier]
1couche
[dao]
Donnes
Spring IoC
la couche [1-dao] (dao=Data Access Object) s'occupe de l'accs aux donnes. Celles-ci sont places dans une base de
donnes.
la couche [2-mtier] s'occupe de l'aspect mtier de l'application, le calcul de la paie.
la couche [3-ui] (ui=User Interface) s'occupe de la prsentation des donnes l'utilisateur et de l'excution de ses requtes.
Nous appelons [Application] l'ensemble des modules assurant cette fonction.
les trois couches sont rendues indpendantes grce l'utilisation d'interfaces .NET
l'intgration des diffrentes couches est ralise par Spring IoC
Les pages ASP.NET ncessaires au dialogue avec l'utilisateur font partie de la couche [ui]. Ce qui a t vu dans ce document est
suffisant pour construire ces pages web. Le reste de l'application est constitu des couches [mtier] et [dao]. La comptence
ASP.NET n'intervient pas dans ces couches. Il suffit d'avoir une comptence classique en VB.NET ou C#.
Le traitement d'une demande d'un client se droule selon les tapes suivantes :
1. le client fait une demande l'application.
2. l'application traite cette demande. Pour ce faire, elle peut avoir besoin de l'aide de la couche [mtier] qui elle-mme peut avoir
besoin de la couche [dao] si des donnes doivent tre changes avec la base de donnes. L'application reoit une rponse de la
couche [mtier].
3. selon celle-ci, elle envoie la vue (= la rponse) approprie au client.
L'interface prsente l'utilisateur peut avoir diverses formes :
1.
2.
3.
4.
une application console : dans ce cas, la vue est une suite de lignes de texte.
une application graphique windows : dans ce cas, la vue est une fentre windows
une application web : dans ce cas, la vue est une page HTML
...
une version ASPNET comportant un unique formulaire et construite avec une architecture une couche.
une version identique la prcdente mais avec des extensions Ajax
une version ASP.NET s'appuyant sur une architecture trois couches o la couche d'accs aux donnes est implmente
avec le framework NHibernate. Elle a toujours l'unique formulaire de la version 1.
4. une version 4 ASP.NET multi-vues et mono-page avec l'architecture trois couches de la version 3.
5. la partie serveur d'une application client / serveur o le serveur est implment par un service web s'appuyant sur
l'architecture en couches de la version 3.
6. la partie client de l'application client / serveur prcdente, implmente par une couche ASP.NET.
7. une version 7 ASP.NET multi-vues et multi-pages avec l'architecture trois couches de la version 3.
8. une version 8 ASP.NET multi-vues et multi-pages cliente du service web de la version 5.
9. une version 9 ASP.NET multi-vues et multi-pages avec l'architecture trois couches de la version 3 o la couche d'accs
aux donnes est implmente par des classes de Spring qui facilitent l'utilisation du framework NHibernate.
10. une version 10 implmente en FLEX et cliente du service web de la version 5.
http://tahe.developpez.com
45/46
http://tahe.developpez.com
46/46