Vous êtes sur la page 1sur 15

M24 : Web Dynamique

ASP.Net VB
Formateur : Driouch B. (cfmoti.driouch@gmail.com) Etablissement : OFPPT/GC/CFMOTI (15/06/2011) (15/06/2011) http://www.istahttp://www.ista-ntic.net/ http://www.driouchb.0fees.net/

DRIOUCH B.

Plan
Gnralit Web (Introduction ASP.Net) Interface EDI ASP.Net) (VS.Net) VS.Net) Evnement particulier(application, session, Postback) Postback) Contrle serveur Contrle HTML Cookies, variable session, variable application, paramtre Get(Querystring) Get(Querystring) User Contrles Validateur des donnes sur formulaire Accs aux donnes ADO.Net Master Page Authentification (Windows, Session, Formulaire, Passport) Passport) Fichier de configuration WebConfig Fichier Global.asax (Evnement) Dbogage et Traage
DRIOUCH B. 2

Introduction ASP.NET 2.0


L'interaction Client / Serveur est la base principale des applications web. Il est donc trs important de bien comprendre le principe de fonctionnement d'ASP.NET dans l'environnement DotNet avec le serveur IIS.

Environnement de dveloppement : Un serveur Web : Configuration IIS Framework 2.0 : install avec VisualStudio .Net Un EDI : VisualStudio .Net, pas ncessaire mais pratique Exemple : (dans un fichier bloc note) <%@ Page Language="VB" %> <html><body> <h1>Bonjour</h1> <br /> <h2>Nous sommes le <%= DateTime.Now.ToString() %>.</h2>
DRIOUCH B.

</body></html>

Interface EDI (VS.Net) VS.Net)


Environnement de Dveloppement Intgr : l'explorateur de solution : les proprits : la page de code : deux boutons "design" et "source" la boite outils :
Contrle
Un "label" : Label1 Un "textbox" droite de Label1 : TextBox1 Un "button" sous Label1 : Button1 Un "label" sous le bouton : Label2

Proprit
Text BorderWidth Text Text

Contenu
"Nom :" 2 "Cliquez" "Bonjour"

label2.text=label2.text label2.text=label2.text & " " & textbox1.text textbox1.text

DRIOUCH B.

Evnement Particulier
Application :
Evnement
Application_Start Application_End

Description
Excut lors du premier appel une page du site depuis le dmarrage de IIS Appel lorsque l'application se termine, cela ne signifie pas que IIS s'arrte mais est d'office appel si, pour une raison quelconque IIS est arrt

Session :
Evnement
Session_Start Session_End

Description
appel lors de chaque nouvelle session d'un navigateur client 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 donnes en mode "InProc" (dans le "InProc" process en mmoire) ou en mode "Sql..." (dans une BD SqlServer) via la base de SqlServer) donnes "AspNetState". "AspNetState".

Schmas visualise la Diffrence Entre application et session:


DRIOUCH B. 5

Evnement Particulier
PostBack
IsPostBack : est une proprit de la page boolenne (readreadonly) only) qui permet justement d'effectuer ce genre de test. test. Par exemple, on l'utilise dans l'vnement Page_Load pour viter de recharger des donnes persistantes. persistantes. AutoPostBack est une proprit des contrles qui active le dclenchement d'un aller retour sur le serveur. serveur. Pour activ lexcution au changement du DropDownList: DropDownList: DropDownList.AutoPostBack= DropDownList.AutoPostBack=True

DRIOUCH B.

Les Controls Serveur-HTML ServeurUn petit mot sur les types de contrles prsents dans ASP.NET. Il ASP.NET. existe deux jeux de contrles s'excutant ct serveur : Les Web Controls, grs par des vnements, ils ressemblent Controls, plus aux objets utiliss dans du dveloppement winforms c'est-c'estdire qu'ils possdent des proprits ("font", "backcolor", ...) backcolor", ...) facilitant la mise en forme. forme. Ils dpendent de "System.Web.UI.WebControls". System.Web.UI.WebControls" Les HTML Controls qui correspondent directement aux balises HTML. HTML. Les attributs des balises correspondantes sont accessibles via les proprits de ces contrles. Pour faire une analogie avec contrles. les "WebControls", ceux-ci ne possdent qu'une balise "Style" WebControls", ceuxpour la mise en forme, cela est plutt limitatif. limitatif. Ces derniers dpendent eux de "System.Web.UI.HtmlControls". System.Web.UI.HtmlControls"

DRIOUCH B.

ViewState
le ViewState, nouveau concept introduit par Microsoft avec ASP.NET, reprsente l'tat de ViewState, ASP. l'tat l'ensemble des contrles d'un page. Les informations sont sauves sous forme d'un page. flux srialis dans la page HTML et le champ cach _VIEWSTATE permet le transit de ces informations entre le client et le serveur. serveur. Il peut tre dsactiv au niveau d'un contrle, au niveau d'une page ou au niveau d'une application en plaant la proprit EnabledViewState False. False. Le plus intressant est que le programmeur peut y ajouter ses propres informations sous forme d'objets indexs par une cl de type String. String.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Page_Load( System.EventArgs) Me. If Not IsPostBack Then ViewState("tri") ViewState("tri") = "nom ConstruireRequete() ConstruireRequete() End If End Sub Private Sub ConstruireRequete Dim tri As String = CType(ViewState("tri"), String) CType(ViewState("tri"), 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) cmdLocalite_Click( System.EventArgs) cmdLocalite. cmdLocalite.Click ViewState("tri") ViewState("tri") = "localite localite ConstruireRequete() ConstruireRequete() End Sub
DRIOUCH B.

Handles

Cookies
Les cookies permettent aux applications Web de stocker des informations spcifiques l'utilisateur.
Exemple de Cration de cookie :
Dim cookie As HttpCookie Dim User As String User = "neo" cookie = New HttpCookie(login") HttpCookie(login") cookie.Values.Add(login", User) cookie.Values.Add(login", Response.Cookies.Add(cookie) Response.Cookies.Add(cookie) Dim cookie As HttpCookie cookie = Request.Cookies(login") Request.Cookies(login") Dim User As String User= cookie.Value() cookie.Value()

Exemple de Lecture de cookie

DRIOUCH B.

Cookies
Dtecter si le navigateur supporte les cookies
Dim CoookiesSupported As Boolean = Request.Browser.Cookies

Supprimer un cookie : Vous ne pouvez pas supprimer directement un cookie sur l'ordinateur d'un utilisateur. Mais vous pouvez donner au utilisateur. navigateur de l'utilisateur l'ordre de supprimer le cookie en rglant la date d'expiration de ce cookie sur une date rvolue. rvolue. myCookie.Expires = DateTime.Now.AddDays(-1D) DateTime.Now.AddDays(

DRIOUCH B.

10

Variable de session
"Session" est un objet qui s'utilise un peu comme le ViewState, c'est--dire avec une ViewState, c'estcl mais se comporte plutt comme une table de hachage. Prenons deux pages aspx : page1.aspx : page dans laquelle nous encodons, par l'intermdiaire d'un TextBox, un TextBox, nom de socit page2.aspx : page dans laquelle nous affichons le nom de la socit Code de la page1.aspx : L'utilisateur introduit un nom de socit dans la TextBox nomme "txtNomSoc". "txtNomSoc".
Protected Sub cmdAfficheSoc (Byval sender As Object, ByVal e As System.EventArgs) Handles System.EventArgs) cmdAfficheSoc.Click Session("NomSoc") Session("NomSoc") = txtNomSoc.Text Response.Redirect("page2.aspx") Response.Redirect("page2.aspx") End Sub

Code de la page2.aspx : Un test est effectu pour savoir si la variable de session contient bien une donne.
Protected Sub Page_Load (Byval sender As Object, ByVal e As System.EventArgs) Handles Me.Load System.EventArgs) If Session("NomSoc") IsNot Nothing Then Session("NomSoc") lblNomSoc.Text = CType(Session("NomSoc"), String) CType(Session("NomSoc"), Else Response.Write("Aucune Response.Write("Aucune socit n'a t choisie !") End If End Sub
DRIOUCH B. 11

Variable Application
La grande diffrence avec l'objet Session se situe dans le fait qu'un objet Application conserve des donnes pour l'ensemble des utilisateurs d'un mme site web. Il s'utilise de la mme manire que l'objet Session. web. Session.
Protected Sub Page_Load (Byval sender As Object, ByVal e As System.EventArgs) Handles Me.Load System.EventArgs) Dim cpt As Integer = 0 Application.Lock() Application.Lock() If Application("Compteur") IsNot Nothing Then Application("Compteur") cpt = CType(Application("Compteur"), Integer) CType(Application("Compteur"), Integer) End If cpt = cpt + 1 Application("Compteur") = cpt Application.UnLock() Application.UnLock() lblVisite.Text = "Page vue : " & cpt & " fois. " End Sub

Et dans chaque page : response.write(Application("Compteur") ) response.write(Application("Compteur") L'objet Application tant commun tous les utilisateurs du site, il est prfrable de bloquer l'accs lors de l'criture et, bien entendu, de ne pas oublier l'action inverse. inverse.
DRIOUCH B. 12

QueryString
QueryString permet de faire passer des informations via l'URI d'une page une autre. En reprenant l'exemple d'un ID de socit slectionn dans une page dont les donnes sont prsentes dans une autre page, on aurait trs bien pu indiquer cet ID via l'URI lors de l'appel la deuxime page. Vous avez choisi la socit ayant un ID = 1235, voici comment passer l'identifiant la page suivante : <A href="page2.aspx?idsoc=1235"></A> href="page2.aspx?idsoc=1235"></A> Pour rcuprer l'ID dans la seconde page, il vous suffira de coder comme suit : <p>Vous avez choisi la socit : & Request.QueryString("idsoc")</p> 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

DRIOUCH B.

13

Contrles utilisateur ASP.NET


Il peut arriver que vous ayez besoin dans un contrle des fonctionnalits dont les contrles serveur Web ASP.NET intgrs ne disposent pas. Vous pouvez alors crer vos propres contrles. Pour ce faire, vous disposez de deux options : Vous pouvez crer :
Des contrles utilisateur. Les contrles utilisateur sont des conteneurs dans lesquels vous pouvez placer des balises et des contrles serveur Web. Vous pouvez ensuite traiter le contrle utilisateur comme une unit et lui assigner des proprits et des mthodes. Des contrles personnaliss. Un contrle personnalis est une classe que vous crivez et qui drive de Control ou de WebControl. WebControl.

DRIOUCH B.

14

Structure de contrle utilisateur


Un contrle Web ASP.NET ressemble une page ASP.NET complte (fichier ASP. ASP. .aspx), avec la fois une page d'interface utilisateur et du code. Un contrle aspx), code. utilisateur se cre de faon trs semblable une page ASP.NET. ASP.NET.
L'extension du nom de fichier du contrle utilisateur est .ascx. .ascx. Au lieu d'une directive @ Page, le contrle utilisateur contient une directive Page, @ Control qui dfinit la configuration et d'autres proprits. Les contrles utilisateur ne peuvent pas s'excuter comme des fichiers autonomes. Vous devez au lieu de cela les ajouter des pages ASP.NET, comme vous le feriez pour n'importe quel contrle. Le contrle utilisateur ne contient pas d'lment html body ou form. Ces form. lments doivent se trouver dans la page d'hbergement.

L'exemple suivant montre un contrle utilisateur qui implmente un contrle Spinner dans lequel les utilisateurs peuvent cliquer leur guise sur des boutons pour naviguer dans une srie de choix au sein d'une zone de texte. texte.
DRIOUCH B. 15

Exemple UC
<%@ Control Language="VB" ClassName="UserControl1" %> ClassName="UserControl1" <script runat="server"> runat="server"> Protected colors As String() = {"Red", "Green", "Blue", "Yellow"} Protected currentColorIndex As Integer = 0 Protected Sub Page_Load(ByVal sender As Object, _ Page_Load( ByVal e As System.EventArgs) System.EventArgs) If IsPostBack Then currentColorIndex = CInt(ViewState("currentColorIndex")) CInt(ViewState("currentColorIndex")) Else currentColorIndex = 0 DisplayColor() DisplayColor() End If End Sub Protected Sub DisplayColor() DisplayColor() textColor.Text = colors(currentColorIndex) colors(currentColorIndex) ViewState("currentColorIndex") currentColorIndex.ToString() ViewState("currentColorIndex") = currentColorIndex.ToString() End Sub Protected Sub buttonUp_Click(ByVal sender As Object, _ buttonUp_Click( ByVal e As System.EventArgs) System.EventArgs) If currentColorIndex = 0 Then currentColorIndex = colors.Length - 1 Else
DRIOUCH B. 16

Exemple UC
currentColorIndex -= 1 End If DisplayColor() DisplayColor() End Sub Protected Sub buttonDown_Click(ByVal sender As Object, _ buttonDown_Click( ByVal e As System.EventArgs) System.EventArgs) If currentColorIndex = colors.Length - 1 Then currentColorIndex = 0 Else currentColorIndex += 1 End If DisplayColor() DisplayColor() End Sub </script> <asp:TextBox ID="textColor" runat="server" ID="textColor" runat="server" ReadOnly="True" /> ReadOnly="True" <asp:Button Font-Bold="True" ID="buttonUp" runat="server" FontID="buttonUp" runat="server" Text="^" OnClick="buttonUp_Click" OnClick="buttonUp_Click" /> <asp:Button Font-Bold="True" ID="buttonDown" runat="server" Text="v" FontID="buttonDown" runat="server" OnClick="buttonDown_Click" OnClick="buttonDown_Click" />

DRIOUCH B.

17

Ajout d'un contrle utilisateur une page


Pour utiliser un contrle utilisateur, vous devez l'inclure dans une page Web ASP.NET.

Dans la page Web ASP.NET conteneur, crez une directive @ Register comprenant :
Un attribut TagPrefix, qui associe un prfixe au contrle utilisateur. TagPrefix, Ce prfixe sera inclus dans la balise d'ouverture de l'lment du contrle utilisateur. Un attribut TagName, qui associe un nom au contrle utilisateur. Ce TagName, nom sera inclus dans la balise d'ouverture de l'lment du contrle utilisateur. Un attribut Src, qui dfinit le chemin d'accs virtuel au fichier contrle Src, utilisateur que vous incluez.

Dans le corps de la page Web, dclarez l'lment contrle utilisateur l'intrieur de l'lment form. form. ventuellement, si le contrle utilisateur expose des proprits publiques, dfinissez-les de faon dclarative. dfinissezDRIOUCH B. 18

Validation des donnes


La validation des donnes est en gnral la chose la plus importante dans un site web. web. La validation ct client est donc celle qui intervient la premire et se fait en gnral en JavaScript. ASP.NET fournit des contrles de validation qui JavaScript. ASP. gnrent le code javascript associ Les principaux contrles de validation sont : RequiredFieldValidator RangeValidator CompareValidator RegularExpressionValidator CustomValidator ValidationSummary Voyons un peu les caractristiques gnrales de chacun.
DRIOUCH B. 19

RequiredFieldValidator
Le plus frquemment utilis car il est le seul qui peut s'assurer qu'un champ n'est pas vide.
proprit
ControlToValidate ErrorMessage InitialValue Text

Utilisation
doit contenir le nom du contrle valider message afficher en cas d'erreur dans le contrle ValidationSummary contient une valeur qui invalide le contrle si celui-ci est gal cette valeur prcise texte affich en cas de non validation

Exemple de RequiredFieldValidator sur une TextBox nomme TxtNom : <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" runat="server" ControlToValidate="TxtNom" ErrorMessage="Admin ControlToValidate="TxtNom" ErrorMessage="Admin n'est pas un nom valide" SetFocusOnError="True" InitialValue="Admin"></asp:RequiredFieldValidator> SetFocusOnError="True" InitialValue="Admin"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" runat="server" ControlToValidate="TxtNom" ErrorMessage="Le ControlToValidate="TxtNom" ErrorMessage="Le champ nom est obligatoire" / > Vous remarquez que pour valider le nom qui est obligatoire, il nous faut 2 contrles RequiredFieldValidator. RequiredFieldValidator. Un pour signaler que le nom ne peut pas tre un champ vide, l'autre pour interdire l'utilisation du nom "Admin". "Admin".
DRIOUCH B. 20

10

RangeValidator
Comme son nom l'indique, il sera utilis pour valider l'encodage entre des bornes donnes.
Nom de la proprit
ControlToValidate ErrorMessage MinimumValue MaximumValue Text

Utilisation
doit contenir le nom du contrle valider message afficher en cas d'erreur dans le contrle ValidationSummary valeur minimale de la plage de donnes valeur maximale de la plage de donnes 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 runat="server" Text="Entrez :"</asp:Label> :"</asp:Label> <asp:TextBox ID="TxtValeur" runat="server"></asp:TextBox> ID="TxtValeur" runat="server"></asp:TextBox> <asp:RangeValidator ID="RangeValidator1" runat="server" runat="server" ErrorMessage="RangeValidator" MaximumValue="10" MinimumValue="1" ErrorMessage="RangeValidator" MaximumValue="10" MinimumValue="1" Type="Integer" ControlToValidate="TxtValue">Valeur Type="Integer" ControlToValidate="TxtValue">Valeur entre 1 et 10 requise ! </asp:RangeValidator> </asp:RangeValidator>

DRIOUCH B.

21

CompareValidator
Il utilise un oprateur pour comparer les valeurs en prsence et valider leur concordance. Comparaison un type.
<asp:CompareValidator runat="server" ID="CompareValidator1" runat="server" ControlToValidate="TxtValeur" Type="Integer" Operator="DataTypeCheck" ControlToValidate="TxtValeur" Type="Integer" Operator="DataTypeCheck" ErrorMessage="Doit ErrorMessage="Doit tre un chiffre entier de type integer !"</asp:CompareValidator> !"</asp:CompareValidator>

Comparaison une valeur.


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

Comparaison un autre champ.


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

DRIOUCH B.

22

11

RegularExpressionValidator
Ce contrle valide un champ suivant une expression rgulire : ValidationExpression. ValidationExpression.
<asp:Label ID="Label1" runat="server" Text="Entrer votre numro runat="server" Text="Entrer de compte :"</asp:Label> :"</asp:Label> <td><asp:TextBox ID="TxtCptBancaire runat="server"> <td><asp:TextBox ID="TxtCptBancaire runat="server"> </asp:TextBox> </asp:TextBox> <td><asp:RegularExpressionValidator <td><asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" runat="server" ErrorMessage="RegularExpressionValidator" ErrorMessage="RegularExpressionValidator" ControlToValidate="TxtCptBancaire" ControlToValidate="TxtCptBancaire" ValidationExpression="^\d{3}- d{7}ValidationExpression="^\d{3}-\d{7}-\d{2}$"> Format incorrect </asp:RegularExpressionValidator> </asp:RegularExpressionValidator>

DRIOUCH B.

23

CustomValidator
L'utilisateur dfinit lui-mme une fonction pour effectuer la validation luilorsque les contrles standards ne peuvent pas assumer ce rle. Dans le cas d'une validation ct client :
La proprit ClientValidationFunction contient le nom de la fonction La fonction doit tre sous la forme : Function ValidationPersonnelle (source, arguments) la source est l'objet CustomValidator ct client arguments est un objet comportant deux proprits : Value et IsValid La proprit Value est la valeur valider La proprit IsValid est un boolen retournant le rsultat de la validation La validation ct client s'effectue avec du code javascript soit entre les balises ad hoc, soit dans un fichier ".js" spar. ".js" Ce genre de code est bien connu des dveloppeurs javascript : <script language="javascript">function Validation (obj, args){} language="javascript">function (obj, args){} </script>

Dans le cas d'une validation ct serveur : Placez le code de validation dans l'vnement OnServerValidate
DRIOUCH B. 24

12

Laccs aux donnes avec ASP.NET


Vous pouvez crire du code pour accder aux donnes l'aide de classes de l'espace de Synoms System.Data (connu sous le nom ADO.NET), Cette liaison n'exige aucun code Synoms pour les scnarios de donnes les plus courants, et notamment :
la slection et l'affichage de donnes ; le tri, la pagination et la mise en cache de donnes ; la mise jour, l'insertion et la suppression de donnes ; le filtrage de donnes l'aide de paramtres d'excution ; la cration de scnarios matre/dtails l'aide de paramtres.

Les contrles de source de donnes offrent des fonctionnalits puissantes de rcupration et de modification de donnes, et notamment en termes de requtes, de tri, de pagination, de filtrage, de mise jour, de suppression et d'insertion. ASP.NET d'insertion. ASP. comprend les contrles de source de donnes suivants :
Contrle de source de donnes ObjectDataSource SqlDataSource AccessDataSource XmlDataSource SiteMapDataSource
DRIOUCH B.

Description Permet d'utiliser un objet mtier ou une autre classe et de crer des applications Web qui s'appuient sur des objets de couche intermdiaire pour grer des donnes. Permet d'utiliser les fournisseurs de donnes manags ADO.NET, lesquels offrent un accs aux bases de donnes Microsoft SQL Server, OLE DB, ODBC ou Oracle. Permet d'utiliser une base de donnes Microsoft Access. Permet d'utiliser un fichier XML, ce qui est trs utile pour les contrles serveur ASP.NET hirarchiques tels que les contrles TreeView ou Menu. Utilis avec la navigation de site ASP.NET. Pour plus d'informations
25

DRIOUCH B.

26

13

Master Page
Depuis longtemps, les dveloppeurs ont toujours t contraint de dupliquer les sources HTML du design sur chaque page. page. Dautre solution intermdiaire existait, par exemple lutilisation des frames en HTML, cependant cette fonction appartient au langage HTML et prsente beaucoup de problme, notamment au niveau des emplacements, de plus les frames sont de moins en moins utilises de nos jours. La fonctionnalit MasterPage a jours. longtemps t demande par les dveloppeurs, elle nexistait toujours pas dans les versions prcdentes de lASP.NET lASP. La MasterPage (extension *.master) contiendra la source (X)HTML du design et des zones ddition (contentPlaceHolder), contentPlaceHolder), permettant ainsi de crer plusieurs page (contentPage) du mme contentPage) design. design. Il suffit ensuite de modifier les zones dditions sur chaque page. page.
DRIOUCH B. 27

Cration d'une MasterPage


Pour crer une MasterPage, faites un clique-droit sur le nom votre MasterPage, cliqueWebSite, WebSite, puis sur ajouter nouvel element . Une fentre apparatra, il vous suffira de choisir MasterPage et de renommer, si vous le souhaitez, le nom de la MasterPage. MasterPage. Vous remarquerez que len-tte de la MasterPage contient le motlenmotcl Master , la diffrence dune page simple qui contient le motmotcl Page . <%@ Master Language="C#" Language="C#" AutoEventWireup="true" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

DRIOUCH B.

28

14

Authentification
Authentification Authentification Authentification Authentification Windows Session Formulaire Passport

DRIOUCH B.

29

15