Tutoriel 8.1: Configuration d’Applications ASP.NET

L’objectif de ce tutoriel (programmation avancée) est d’affecter des paramètres de configuration à une application web et notamment les paramètres de localisation (« globalization »). A travers l’utilisation de la balise « location » ou d’un sous-répertoire avec le fichier « web.config », vous allez trouver comment le même message est affiché en plusieurs langues dans des portions différentes de l’application. Etape 1 : Préparation L’objectif de cette étape est de créer une arborescence de dossiers de notre application web. Il s’agit aussi de créer un texte traduit en plusieurs langues (français, anglais et arabe) qui va être affiché dans plusieurs zones selon la configuration en cours. Ouvrez VS2012 Créez une application ASP.NET vide appelée « TestConfiguration » Ajoutez une forme web appelée « Default.aspx » Ajoutez deux répertoires, l’un appelé « Rep1 » et l’autre appelé « Rep2 » Ajoutez une forme web dans le répertoire « Rep1 » et appelez-la « Page1 » Ajoutez une forme web dans le répertoire « Rep2 » et appelez-la « Page2 » L’arborescence de la solution devrait ressembler à ceci :   Ouvrez la page « Default.aspx » et ajoutez-y deux liens hypertexte, l’un pour « Page1 » et l’autre pour « Page2 » Ajoutez un nouvel élément au projet « TestConfiguration » A gauche, sélectionnez « Général » Dans le modèle, choisissez fichiez de ressources. Appelez-le, « MyStrings.resx » Dans la colonne « Nom » entrez « Bienvenue » Dans la colonne « Valeur », entrez « Bienvenue au tutoriel de Mr Mostefai Mohammed Amine » Maintenant, il s’agit d’ajouter le texte traduit en anglais et en arabe Ajoutez un autre fichier de ressources appelé « MyStrings.en.resx » Dans le nouveau fichier de ressources, tapez « Bienvenue » dans la colonne « Nom » Tapez « Welcome to Mostefai Mohammed Amine's tutorial » dans la colonne « valeur » Ajoutez un fichier de ressources appelé « MyStrings.ar.resx » Dans la zone « Nom » entrez « Bienvenue » Dans la zone « Valeur » entre « مرحبا بكم في البرنامج التعليمي لمصطفاي محمد الأمين » Ouvrez la page « Default.aspx » en mode « code behind » Entrez le code suivant dans l’évènement « Page_Load » de la page Response.Write(MyStrings.Bienvenue); Tapez le même code dans l’évènement « Page_Load » de « Page1.aspx » et « Page2.aspx » Etape 2 : Configuration L’objectif de cette étape est de changer la configuration de façon à ce que la langue par défaut soit le français pour l’application, l’anglais pour « Rep1 » et l’arabe pour « Rep2 ». L’objectif est de découvrir les deux moyens d’appliquer une configuration à un répertoire : la balise « location » et les fichier de configuration additionnels. Dans l’explorateur de solutions, ouvrez « web.config » Examinez la structure de ce fichier configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration> Dans la section « system.web », ajoutez l’élément suivant : <globalization culture="fr-FR" uiCulture="fr-FR"/> Après la section « system.web » et avant l’élément fermant de configuration, ajoutez une balise location comme suit : <location path="Rep1"> <system.web> <globalization culture="en-US" uiCulture="en-US"/> </system.web> </location> La balise location définit une localisation (langue) différente qui est l’anglais pour toutes les pages se trouvant dans le répertoire « Rep1 ». Sur le répertoire « Rep2 » cliquez sur le bouton droit de la souris Cliquez sur « Ajouter un nouvel élément » Dans le modèle, choisissez « Fichier de configuration web » et laissez le nom à « Web.config »     Ouvrez le nouveau fichier de configuration Dans la section « system.web », ajoutez l’élément « globalization » comme suit : <globalization culture="ar-DZ" uiCulture="ar-DZ"/> Appuyez sur « F5 » pour exécuter Remarquez le changement de la langue du texte en parcourant les différentes pages Pour télécharger le code source, cliquez ici

Combining Table Per Hierachy Strategy with Table Per Type Strategy in Entity Framework

For an e-learning project that I coach, the team is using Entity Framework 5 in conjunction with SQL Server. During the data model design, we were facing an interesting situation where we had to combine between both EF inheritance strategies: the table per type (TPT) strategy and the table per hierarchy strategy (TPH). In this article, I will share the technique that will allow us to use both techniques using fluent mapping. The data model consists of five classes (I am using a reduced version for simplicity and confidentiality reasons) : the resource which is a learning resource such as a question or a questionnaire. There are two types of questions : class A questions and class B questions. The data model is illustrated in the class diagram below : To persist the entities, we needed three tables : “Resource”, “Question” and “Questionnaire”. The first table contains the common fields shared by all the resources. In addition to that, the tables “Question” and “Questionnaires” will contain the specific data related to questions and questionnaires. A minimalistic version of the database is shown in the diagram below :   Every questionnaire will have its fields split between the table “Questionnaire” and “Resource”. Every question will have its fields split between the table “Question” and “Resource”. Knowing that the class Question is abstract (so is the class Resource), the two tables (Question and Resource) will persist instances of the two classes “QuestionClassA” and “QuestionClassB”. To achieve all this, we needed to combine the TPT and the TPH strategies in our mappings and as you could guess, it’s possible with Entity Framework. The first step is to write the mappings for the class “Resource” : public class ResourceMapping : EntityTypeConfiguration<Resource> { public ResourceMapping() { ToTable("Resource"); HasKey(e => e.Id); Property(e => e.Id) .HasColumnName("ResourceId") .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); Property(e => e.Text) .HasColumnName("ResourceText") .IsRequired();   } } This is a very conventional mapping where we map an auto-generated int key and a string field. After the resource mapping, we will map the entity “Questionnaire” knowing that there is a “1….0..1”  relationship between the tables “Resource” and “Questionnaire”. In the questionnaire entity, there is an additional property called “QuestionnaireDate” mapped to a column with the same name. Below is the fluent mapping for the questionnaire : public class QuestionnaireMapping : EntityTypeConfiguration<Questionnaire> { public QuestionnaireMapping() { ToTable("Questionnaire"); Property(e => e.QuestionnaireDate); } } Notice the “ToTable” method that indicates that the fields are mapped to columns belonging to another table. That’s the key to the TPT strategy. Finally, and that’s the interesting part, the mapping of the entity“Question”. The mapping below not only indicates that the entity is mapped to another table, but indicates also that the two descendant types are mapped to this table using the “Map” method : public class QuestionMapping : EntityTypeConfiguration<Question> { public QuestionMapping() { ToTable("Question"); Property(e => e.AnswerId); Map<QuestionClassA>(e => e.Requires("QuestionType").HasValue<byte>(1)).ToTable("Question"); Map<QuestionClassB>(e => e.Requires("QuestionType").HasValue<byte>(2)).ToTable("Question"); } } The TPH is achieved using a descriminator column that is called “QuestionType”. A value of 1 of the descriminator correspond to a class A question while a value of 2 corresponds to a class B one. To test our mapping, I simply created a console application that creates sample data and lists it using the “Prepare” and “AddResource” methods : private static void Prepare(MyContext context) { AddResource<QuestionClassA>(context, "question A", e => e.AnswerId = 1); AddResource<QuestionClassB>(context, "question B", e => e.AnswerId = 5); AddResource<Questionnaire>(context, "questionnaire", e => e.QuestionnaireDate = DateTime.Now); context.SaveChanges(); }   private static void AddResource<T>(MyContext context, string text, Action<T> initMethod) where T : Resource, new() { T entity = new T() { Text = text }; if (initMethod != null) initMethod(entity); context.Resources.Add(entity); } Enjoy. You can find attached with this blog the source code and the database script : Download the code hereAnd the db script here

Tutoriel 6.3 : Connexion des contrôles aux bases de données

Tutoriel 6.3.zip (2.83 mb) L’objectif de ce tutoriel (troisième du module 6) est d’utiliser les capacités d’ASP.NET afin de connecter directement des contrôles ASP.NET aux bases de données. Prérequis : Ce tutoriel requiert que la base de données « AdventureWorks » soit installée dans la machine. Cette base peut être téléchargée sur http://sqlserversamples.codeplex.com/ . Etape 1 – Création des sources de données L’objectif de cette étape est de montrer comment créer des sources de données utilisées dans des pages web. Nous nous intéresserons en particulier à EntityDataSource qui se connecte à un contexte EntityFramework. Créer une nouvelle application ASP.NET vide appelée « TestControlesDB » Ajoutez une page appelée « Default.aspx » Ajoutez un nouveau modèle EntityFramework et appelez-le « AdventureWorksModel » Cliquez ensuite sur « Générer à partir d’une base de données » Créez une nouvelle connexion sur « AdventureWorks » ensuite sur « Suivant » Dans l’assistant, cochez les tables « Product » et « ProductCategory » et cochez « Pluraliser et Singulariser les entités générées » Cliquez sur « Terminer » Le modèle est généré comme suit : Compilez le projet en appuyant sur « F6 » Ouvrez la page « Default.aspx » en mode design Faites glisser un composant « EntityDataSource » depuis la barre à outils (onglet données) jusqu’à la page « Default » Dans la propriété « ID » de la source, entrez « categorySource » Sur la page « Default.aspx », cliquez sur la flèche sur « categorySource » puis sur « Configure la source de données » Dans la zone « Connexion Nommées », sélectionnez « AdventureWorksLT2008R2Entities » ou le nom que vous avez choisi pour le contexte Cliquez sur « Suivant » Dans la zone « Nom de l’ensemble », sélectionnez « ProductCategories » Cliquez sur « Terminer » Etape 2 : Création d’une source de données esclave L’objectif de cette étape est de créer une source de données filtrée automatiquement. Le but de cette source de données est de n’afficher que les produits appartenant à une certaine catégorie. La récupération du critère de filtrage (ProductCategoryID) s’effectuera via l’URL en utilisant les chaines de connexion. Ouvrez « Default.aspx » en mode conception Ajoutez un composant « EntityDataSource » à la page et appelez-le « productSource » Cliquez sur la flèche puis « Configurer la source de données » Dans la connexion « Nommée », sélectionnez « AdventureWorksLT2008R2 » ou le nom du contexte que vous avez choisi Cliquez sur « Suivant » Dans la zone « Ensemble d’entités », sélectionnez « Product » Cochez « Activer les suppressions automatiques » et « Activer les modifications automatiques » Cliquez sur « Terminer » Dans la fenêtre de propriétés, cliquez sur la propriété « Where » qui permet le filtrage de la source de données, ensuite dans la propriétés, cliquez sur le bouton en forme de pointillés Dans la zone « Expression du Where », entrez l’expression suivante : it.ProductCategoryID == @categorie Cliquez sur « Ajouter un paramètre » Dans la zone « Nom », entrez « categorie » Dans « Source du paramètres », sélectionnez chaine de requête Cliquez sur « Afficher les options avancées » Dans la propriété « Type », sélectionnez « Int32 » Appuyez sur « OK » Etape 3 : Utilisation du contrôle « ListView » L’objectif de cette étape est d’apprendre à utiliser les templates et de les appliquer au contrôle « ListView ». Le ListView va afficher les enregistrements sous forme de boîtes flottantes avec un maximum de 15 enregistrements par page. Ajoutez une feuille de style appelée « Site.css » Insérez le code suivant dans le fichier CSS : body { font-family: 'Segoe UI' , Tahoma, Geneva, Verdana, sans-serif; padding : 0; margin : 0; }   div.box { background-color: #9595FF; border: thin solid #3333CC; height : 70px; width : 100px; float : left; margin : 2px; padding : 2px;   }   div.clear { clear : both; }   Ouvrez « Default.aspx » en mode design Ajoutez un composant « ListView » à la page Cliquez sur la « flèche » à côté du composant Dans « Choisir la source de données », sélectionnez « categorySource » Ouvrez « Default.aspx » en mode source Entre la balise ouvrante <asp :ListView » et sa balise fermante, insérez la balise « ItemTemplate » Entre les deux balises ItemTemplate, entrez le code suivant : <div class="box"> <strong><% 1: # Eval("Name") %></strong><br /> <a href='Default.aspx?categorie=<%# Eval("ProductCategoryId") %>'>Produits</a> </div> Les balises permettent d’afficher pour chaque enregistrement une « div » dont la classe est « box », une balise « strong » contenant le nom de la catégorie et un lien qui contient une chaîne de requête avec une variable sur le numéro de la catégorie Après la balise fermante « ItemTemplate », ajoutez une balise « LayoutTemplate » Entrez le code suivant : <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> <div class="clear"></div> La balsie <asp :PlaceHolder » va être remplacée par les balises des enregistrements affichés Après la balise fermante « div », faites glisser un « DataPager » à partir de la boîte à outils Entre la balise ouvrante <asp :DataPager » et sa balise fermante, ajoutez la balise « Fields » Ajoutez une balise "asp:NumericPagerField » Cliquez sur la balise « dataPager » Dans la propriété « PageSize », entrez « 15 » Le code sera comme suit : <asp:ListView ID="ListView1" runat="server" DataSourceID="categorySource"> <ItemTemplate> <div class="box"> <strong><% 1: # Eval("Name") %></strong><br /> <a href='Default.aspx?categorie=<%# Eval("ProductCategoryId") %>'>Produits</a> </div> </ItemTemplate> <LayoutTemplate> <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> <div class="clear"></div> <asp:DataPager ID="DataPager1" runat="server" PageSize="15"> <Fields> <asp:NumericPagerField /> </Fields> </asp:DataPager>   </LayoutTemplate> </asp:ListView> Ouvrez « Default.aspx » en mode design Faites glisser « Site.css » sur la page pour appliquer le design Exécutez en appuyant sur « F5 » Etape 4 : Utilisation du contrôle « GridView » L’objectif de cette étape est d’utiliser le composant « GridView »pour afficher les données de manière tabulaire ainsi que de manipuler les différents types de colonnes. Ouvrez « Default.aspx » en mode design Ajoutez un contrôle « GridView » sous le « ListView » Affectez la source « productSource » au « GridView » que vous venez d’ajouter Dans la fenêtre « Propriétés », cliquez sur « Colonnes » puis cliquez sur le bouton en forme de pointillés La fenêtre ci-dessous s’affiche,, cliquez sur « Rafraîchir le schéma » Cliquez sur « BoundField » puis sur le champ « ProductID » ensuite sur « Ajouter » De la même façon, ajoutez le champ « Name » enfant de « BoundField » Sélectionnez « TemplateField » puis cliquez sur « Ajouter » Dans la propriété « HeaderText », entrez « Numéro, Couleur » Sélectionnez « Modifier, Mettre à jour, Annuler », enfant de « CommandField » puis sur « Ajouter » Dans la propriété « HeaderText », entrez « Modifier » Sélectionnez « Supprimer » enfant de « CommandField » puis sur « Ajouter » Entrez « Supprimer » dans la propriété « HeaderText » Ouvrez « Default.aspx » en mode source Insérez le code suivant entre la balise ouvrante <asp :TemplateField » et sa balise fermante <ItemTemplate> <% 1: # Eval("ProductNumber") %>, <% 1: # Eval("Color") %> </ItemTemplate> <EditItemTemplate> Couleur : <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Color") %>'></asp:TextBox> </EditItemTemplate> Ouvrez « Default.aspx » en mode conception Changez la propriété « AllowPaging » à true Développez la propriété « AlternateRowStyle » Dans BackColor, « 9DBDFF » Appuyez sur « F5 » pour exécuter Le code est joint à cet article.

Tutoriel 6.2 : Connexion à une base de données en utilisant Entity Framework

L’objectif de ce tutoriel (deuxième du module 6) est d’utiliser EntityFramework pour effectuer des requêtes sur une base de données. En introduisant une année et en cliquant sur un bouton, l’utilisateur affichera tous les films dont l’année est supérieure à l’année entrée. L’objectif de cette étape est de créer la page permettant la recherche et l’affichage des résultats Lancez VS 2012 Créez une application ASP.NET vide appelée « LinqToEntitiesTest » Ajoutez une forme web appelée « Default.aspx » Glissez un « Label » avec la propriété « Text » à « Année » Glissez un « TextBox » à droite du libellé avec la propriété « ID » à « txtSearch » Ajoutez un bouton à droite de la zone de texte avec la propriété « Text » à « Chercher » et « ID » à « btnSearch » A partir de l’onglet « Données », glissez un « GridView » en dessous des contrôles que vous venez d’ajouter Etape 2 : Création du contexte EntityFramework L’objectif de cette étape est de créer l’objet « Contexte » permettant de se connecter à la base de données de films. Dans l’explorateur de solutions, ajoutez un nouvel élément au projet « LinqToEntitiesTest » Dans les catégories à gauche, choisissez « Données » Dans le modèle, choisissez « Modèle Entité ADO.NET » Dans la zone « Nom » entrez « FormationModel » Cliquez sur le bouton « Ajouter » Visual Studio, demande si on doit générer le modèle à partir d’une base de données existante ou générer un nouveau modèle. Cliquez sur « Générer à partir d’une base de données » puis sur « Suivant » VS demande la chaîne de connexion à utiliser.   Si la chaîne n’existe pas, cliquez sur « Nouvelle Connexion ». Dans la zone serveur entrez « . » ou « .\SQLExpress » selon la version de SQL server installée Dans la zone « base de données » sélectionnez la base de données « Formation » Cliquez sur « Tester la connexion » pour valider Cliquez sur « OK » Cliquez sur « Suivant » Dans le nœud « Tables », cochez la table « Formation » Cochez « pluraliser ou singulariser les entités générées » Cliquez sur « Terminer » VS 2012 génère automatiquement le modèle et l’ouvre en mode conception Remarquez que le modèle contient une seule entité « Film » Etape 3 : Exécution de la requête en utilisant le contexte L’objectif de cette étape est d’utiliser le contexte généré par Visual Studio dans la page web afin de chercher les films dont l’année est supérieure à l’année fournie. Ouvrez la page « Default.aspx » en mode conception Double-cliquez sur le bouton afin de générer l’évènement de clic Dans l’évènement généré, insérez le code suivant: int numero = int.Parse(txtSearch.Text); using (FormationEntities context = new FormationEntities()) { var requete = from entite in context.Films where entite.Annee > numero select entite; GridView1.DataSource = requete.ToList(); GridView1.DataBind();   } Appuyez sur « F5 » pour exécuter Examinez la requête « Linq » et sa syntaxte var requete = from entite in context.Films where entite.Annee > numero select entite; Linq utilise une syntaxe proche du SQL pour permettre aux développeurs d’exécuter des requêtes sur des contextes qui sont traduites par EntityFramework en requêtes SQL Pour télécharger le code, cliquez ici

Tutoriel 6.1 : Connexion aux bases de données en utilisant ADO.NET

L’objectif de ce tutoriel (premier du module 6) est d’explorer certaines capacités de Visual Studio et ASP.NET à gérer et à créer des applications de bases de données. Etape 1 – Connexion à AdventureWorks L’objectif de cette étape est d’utiliser l’explorateur de serveur de Visual Studio 2012 dans le but de se connecter à une base de données. Ce tutoriel requiert que la base de données « AdventureWorks » soit jointe à SQL Server. Pour télécharger cette base, accédez au site : http://sqlserversamples.codeplex.com/ Lancez VS 2012 Dans le menu, sélectionnez « Affichage à Explorateur de Serveur » La fenêtre ci-dessous s’affiche Sur le nœud « Connexion de données », cliquez sur le bouton droit puis « Ajouter une connexion » La fenêtre ci-dessous s’affiche : A côté de la zone « Sources de données », cliquez sur « Changer » La fenêtre ci-dessous s’affiche Remarquez les bases de données auquel .NET peut accéder   Cliquez sur « Annuler » Dans la zone « Nom du serveur » tapez « . » ou « .\SQLExpress » selon la version de SQL Server dont vous disposez Dans la liste se connecter à la base, sélectionnez « AdventureWorksLT2008R2 »* Cliquez sur « Tester la connexion » pour vérifier que ça marche Cliquez sur « OK » Remarquez que VS a ajouté un nouveau nœud sous les connexions de données pointant sur la base de données « AdventureWorks » Développez le nouveau nœud créé Le nœud contient un enfant appelé « tables », développez-le et remarquez que les tables de la base de données sont listées Cliquez avec le bouton droit sur la table « Product » Cliquez sur « Afficher les Données de la table » Une grille s’affiche contenant tous les enregistrements de la table « Product » Etape 2 : Création d’une base de données L’objectif de cette étape est d’utiliser l’explorateur de serveur afin de créer une nouvelle base de données, d’y créer des tables et des données de test. Dans l’explorateur de serveur, cliquez avec le bouton droit sur « Connexions de données » Cliquez sur « Créer une nouvelle base de données SQL Server » Dans la zone « Nom du serveur », tapez « . » ou « .\SQLExpress » selon la version de SQL Server dont vous disposez Dans la zone « Nom de la nouvelle base de données », entrez « Formation » Cliquez sur « OK ». Dans l’explorateur de serveur, cliquez sur le nœud « Tables » de la nouvelle base de données avec le bouton droit Sélectionnez « Ajouter une nouvelle table » Ajoutez une colonne avec le nom « Numero », le type « int » qui n’accepte pas les valeurs vides Ajoutez une colonne avec le nom « Titre », le type « nvarchar(200) » qui n’accepte pas les vides Ajoutez une colonne avec le nom « Annee », le type « int » qui n’accepte pas les vides Cliquez avec le bouton droit sur la ligne contenant la colonne « Numero » et sélectionnez « Clé Primaire » Dans la barre à outils de VS, cliquez sur le bouton « Enregistrer » VS demande ensuite le nom de la table, entrez « Film » Cliquez sur « OK » Dans le nœud « Tables » dans l’explorateur de serveur, cliquez avec le bouton droit sur la table « Film » Sélectionnez « Afficher les données » En utilisant la fenêtre nouvellement affichées, saisissez quelques films Fermez la fenêtre Cliquez avec le bouton droit sur la base de données « Formation » dans l’explorateur de serveur Cliquez sur Propriétés La fenêtre de propriétés s’affiche Remarquez la propriété « Connection String », c’est cette propriété que va utiliser les applications web pour se connecter à la base de données Etape 3 : Accès à la base de données en mode connecté L’objectif de cette étape est d’utiliser l’API ADO.NET afin de se connecter à une base de données en mode connecté. L’affichage se fera suite à la création d’une connexion, d’une commande SQL ramenant tous les films puis la lecture et l’affichage des enregistrements un par un. Créez une application ASP.NET vide appelée « TestADO » Ajoutez une forme web appelée « Default.aspx » Ajoutez un composant « Literal » à la page « Default » Appuyez sur « F7 » pour accéder au code behind Modifiez l’évènement Page_Load comme suit : protected void Page_Load(object sender, EventArgs e) { int numero, annee; string titre, ligne; using (SqlConnection connection = new SqlConnection("chaine_connection")) { connection.Open(); using (DbCommand command = connection.CreateCommand()) { command.CommandText = "SELECT Numero, Titre, Annee FROM Film"; using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { numero = reader.GetInt32(0); titre = reader.GetString(1); annee = reader.GetInt32(2); ligne = string.Format("{0} | {1} | {2} <br/>", numero, titre, annee); Literal1.Text += ligne; } } } } } Remplacez « chaine_connection » par la chaîne de connexion de la base de données « Formation » que vous pouvez récupérer à partir de l’explorateur de serveur Appuyez sur « F5 » pour exécutez   Etape 4 : Accès à la base en mode déconnecté L’objectif de cette étape est de pouvoir utiliser les capacités d’ADO.NET de se connecter à une base de données en mode déconnecté. Il s’agira de la création d’un ensemble de données (DataSet) fortement typé puis de peupler une table à partir des résultats du « DataSet ». Ajoutez au projet une nouvelle forme web appelée « Connected.aspx » Cliquez sur le projet « TestADO » avec le bouton droit puis cliquez sur « Ajouter un nouvel élément » A gauche, sélectionnez « Données » Sélectionnez le modèle ensemble de données « DataSet » Dans la zone « Nom », entrez « FormationDataSet » Cliquez sur OK Visual Studio crée un ensemble de données vide Affichez l’explorateur de serveurs A partir de la base de données « Formation », glissez la table « Film » sur la fenêtre de l’ensemble de données Ouvrez la page « Connected.aspx » en mode conception A partir de la boîte à outils, faites glisser un composant « Table » depuis l’onglet « Standard » Appuyez sur « F7 » pour passer au vue code Changez le code de la méthode « Page_Load » comme suit : TableRow row; TableCell cell; protected void Page_Load(object sender, EventArgs e) { cell = new TableCell(); cell.Text = dataRow.Numero.ToString(); row.Cells.Add(cell); using (FormationDataSet dataSet = new FormationDataSet()) { using (FilmTableAdapter adapter = new FilmTableAdapter()) { adapter.Fill(dataSet.Film); } foreach (TestADO.FormationDataSet.FilmRow dataRow in dataSet.Film.Rows) { row = new TableRow(); cell = new TableCell(); cell.Text = dataRow.Numero.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = dataRow.Titre; row.Cells.Add(cell); cell = new TableCell(); cell.Text = dataRow.Annee.ToString(); row.Cells.Add(cell); Table1.Rows.Add(row); } } } Appuyez sur « F5 » pour exécuter Pour télécharger le code associé, cliquez ici

Tutoriel 5.1–Validation

L’objectif de ce tutoriel (module 5) est d’utiliser les contrôles de validation afin de valider l’inscription d’un développeur à un site. Les informations suivantes doivent être validées : le nom et le prénom sont obligatoires. L’Age doit être numérique et compris entre 18 et 50. Les mails et téléphones doivent respecter le format nécessaire et le langage de programmation doit être soit C# soit C++. Etape 1 – Ajouter les contrôles de validation au formulaire Le but du tutoriel est de permettre à des développeurs de s’inscrire. Le développeur doit fournir les informations suivantes : Nom (obligatoire), Prénom (obligatoire), Age (entre 18 et 50), Langage (C# ou C++), Son mail et son numéro de téléphone portable. Lancez VS 2012 Choisir Fichier -> Nouveau -> Application ASP.NET vide Entrez « TestValidation » dans la zone « Nom » Cliquez sur OK Cliquez sur le bouton droit sur le projet « TestValidation » Ajoutez une nouvelle forme appelée « Default.aspx » Ouvrez « Default.aspx » en mode conception Faites glisser un label dans la page et affectez « Nom : » à la propriété « Text » de ce libellé A côté du libellé, glissez une zone de texte et affectez « txtNom » à la propriété « ID » Faites glisser un « RequiredFieldValidator » à côté de « txtNom » avec les propriétés suivantes : (ErrorMessage = « Veuillez entrer votre nom », ControlToValidate= « txtNom » et CssClass= « validationError », Display= « Dynamic ») Insérez un saut de ligne en appuyant sur « Entrée » ou (<br/>) en mode source Faites glisser un label dans la nouvelle ligne et affectez « Prénom : » à la propriété « Text » de ce libellé A côté du libellé, glissez une zone de texte et affectez " txtPrenom " à la propriété " ID " Faites glisser un « RequiredFieldValidator » à côté de « txtPrenom » avec les propriétés suivantes : (ErrorMessage = « Veuillez entrer votre prénom », ControlToValidate= « txtPrenom » et CssClass= « validationError », Display= « Dynamic ») Insérez un saut de ligne en appuyant sur « Entrée » ou (<br/>) en mode source Faites glisser un label dans la nouvelle ligne et affectez « Age : » à la propriété « Text » de ce libellé A côté du libellé, glissez une zone de texte et affectez « txtAge » à la propriété « ID » Faites glisser un « RequiredFieldValidator » à côté de « txtAge » avec les propriétés suivantes : (ErrorMessage = « Veuillez entrer votre age », ControlToValidate= « txtAge » et CssClass= « validationError », Display= « Dynamic ») Faites glisser un « CompareValidator » à côté de « RequiredFieldValidator » que vous venez d’ajouter avec les propriétés suivantes : (ErrorMessage = « L’âge doit être une valeur numérique», ControlToValidate= « txtAge » et CssClass= « validationError », Display= « Dynamic ») Affectez « DataTypeCheck » à la propriété « Operator » du CompareValidator que vous venez d’ajouter Affectez « Integer » à la propriété « Type » du CompareValidator que vous venez d’ajouter Faites glisser un « RangeValidayor » à côté de « CompareValidator » avec les propriétés suivantes : (ErrorMessage = « L’age doit être inclus entre 18 et 50 », ControlToValidate= « txtAge » et CssClass= « validationError », Display= « Dynamic ») Affectez « 18 » et « 50 » respectivement aux propriétés « Minimum » et « Maximum » du RangeValidator que vous venez d’ajouter Affectez « Integer » à la propriété « Type » du « RangeValidator » que vous venez d’ajouter Insérez un saut de ligne en appuyant sur « Entrée » ou (<br/>) en mode source Faites glisser un label dans la nouvelle ligne et affectez « Langage : » à la propriété « Text » de ce libellé A côté du libellé, glissez une zone de texte et affectez « txtLanguage » à la propriété « ID » Faites glisser un « CustomValidator » à côté de « txtLanguage » avec les propriétés suivantes : (ErrorMessage = « Veuillez entrer un langage correct », ControlToValidate= « txtLanguage » et CssClass= « validationError », Display= « Dynamic ») Double-cliquez sur le « CustomValidator », VS génère l’évènement de validation et génère automatiquement l’évènement ServerValidate Modifiez le code de l’évènement comme suit : protected void CustomValidator1_ServerValidate1(object source, ServerValidateEventArgs args) { args.IsValid = (args.Value == "C#") || (args.Value == "C++"); } Ouvrez la page « Default.aspx » en mode source Dans la section d’entête (avant la balise body), insérez le code JavaScript suivant : <script type="text/javascript"> function ClientValidationHandler(source, args) { args.IsValid = (args.Value == "C#") || (args.Value == "C++"); } </script> Ouvrez « Default.aspx » en mode conception Cliquez sur le « CustomValidator » que vous venez d’ajouter Dans la propriété « ClientValidationFunction » entrez « ClientValidationHandler » Insérez un saut de ligne en appuyant sur « Entrée » ou (<br/>) en mode source Faites glisser un label dans la nouvelle ligne et affectez « Mail : » à la propriété « Text » de ce libellé A côté du libellé, glissez une zone de texte et affectez « txtMail » à la propriété « ID » 7. Faites glisser un « RequiredFieldValidator » à côté de « txtMail » avec les propriétés suivantes : (ErrorMessage = « Veuillez entrer votre mail », ControlToValidate= « txtMail » et CssClass= « validationError », Display= « Dynamic ») Faites glisser un « RegularExpressionValidator » à côté du dernier « RequiredValidator » avec les propriétés suivantes : (ErrorMessage = « Veuillez entrer un mail correct », ControlToValidate= « txtMail » et CssClass= « validationError », Display= « Dynamic ») Dans la fenêtre de propriétés, Cliquez sur la propriété « ValidationExpression », remarquez le bouton avec les pointillés Cliquez sur le bouton avec pointillés, la fenêtre suivante apparaît : Sélectionnez « Adresse Mail » Cliquez sur « OK » Insérez un saut de ligne en appuyant sur « Entrée » ou (<br/>) en mode source Faites glisser un label dans la nouvelle ligne et affectez « N° Mobile : » à la propriété « Text » de ce libellé A côté du libellé, glissez une zone de texte et affectez « txtMobile » à la propriété « ID » Faites glisser un " RegularExpressionValidator " à côté du dernier " RequiredValidator " avec les propriétés suivantes : (ErrorMessage = " Veuillez entrer un numéro correct ", ControlToValidate= " txtMobile " et CssClass= " validationError ", Display= " Dynamic ") Au début de la page, ajoutez un contrôle de type « ValidationSummary » Entrez « validationSummary » dans la propriété « CssClass » du « ValidationSummary » Ajoutez un saut de ligne et un bouton à la fin de la page Le code de la page devrait être équivalent à celui-ci :   <asp:ValidationSummary ID="ValidationSummary1" runat="server" CssClass="validationSummary" /> <br />       <asp:Label ID="Label1" runat="server" Text="Nom : "></asp:Label>   <asp:TextBox ID="txtNom" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtNom" Display="Dynamic" ErrorMessage="Veuillez entre le nom" CssClass="validationError"></asp:RequiredFieldValidator> <br /> <asp:Label ID="Label2" runat="server" Text="Prénom : "></asp:Label> <asp:TextBox ID="txtPrenom" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtPrenom" Display="Dynamic" ErrorMessage="Veuillez entrer le prénom" CssClass="validationError"></asp:RequiredFieldValidator> <br /> <asp:Label ID="Label3" runat="server" Text="Age : "></asp:Label> <asp:TextBox ID="txtAge" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtAge" Display="Dynamic" ErrorMessage="Veuillez donner votre age" CssClass="validationError"></asp:RequiredFieldValidator> <asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="txtAge" Display="Dynamic" ErrorMessage="L'age doit être une valeur numérique" Operator="DataTypeCheck" Type="Integer" CssClass="validationError"></asp:CompareValidator> <asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="txtAge" ErrorMessage="L'age doit être 18 et 50" MaximumValue="50" MinimumValue="18" Type="Integer" CssClass="validationError"></asp:RangeValidator> <br /> <asp:Label ID="Label4" runat="server" Text="Langage : "></asp:Label> <asp:TextBox ID="txtLanguage" runat="server"></asp:TextBox>   <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="CustomValidator" OnServerValidate="CustomValidator1_ServerValidate1" ClientValidationFunction="ClientValidationHandler" ControlToValidate="txtLanguage" CssClass="validationError">Veuillez entrer un langage correct</asp:CustomValidator>   <br /> <asp:Label ID="Label5" runat="server" Text="Mail : "></asp:Label> <asp:TextBox ID="txtMail" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtMail" CssClass="validationError" Display="Dynamic" ErrorMessage="RequiredFieldValidator">Veuillez entrer le mail</asp:RequiredFieldValidator> <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="txtMail" CssClass="validationError" Display="Dynamic" ErrorMessage="RegularExpressionValidator" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">Veuillez entrer un mail valide</asp:RegularExpressionValidator> <br /> <asp:Label ID="Label6" runat="server" Text="N° Mobile : "></asp:Label> <asp:TextBox ID="txtMobile" runat="server"></asp:TextBox> <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" ControlToValidate="txtMobile" CssClass="validationError" ErrorMessage="Veuillez entrer un numéro correct" ValidationExpression="^0(5|6|7)(\d{8})$"></asp:RegularExpressionValidator>   <br />   <asp:Button ID="Button1" runat="server" Text="Button" /> Etape 2 : Installer les paquets nécessaires à la validation côté client avec JQuery L’objectif de cette étape est d’installer les paquets « JQuery » et « AspNet.ScriptManager.JQuery » qui sont nécessaire à mettre en place la validation côté client. Dans le menu cliquez sur « Outils –> Gestionnaire de Paquets –> Console du Gestionnaire de Paquets » La fenêtre ci-dessous s’affiche : Dans la console, entrez « Install-Package JQuery » Une fois le paquet JQuery installé, entrez « Install-Package AspNet.ScriptManager.JQuery » Les paquets installés permettent de gérer la validation côté client avec JQuery Etape 3 : Ajouter du style aux composants de la validation L’objectif de cette étape est d’ajouter les règles CSS nécessaires à afficher les informations de validation en rouge et avec une taille de texte légèrement plus petite. Dans le projet, créer une feuille de style appelée « Site.css » Changez le code du CSS comme suit : body { font-family: 'Segoe UI' , Tahoma, Geneva, Verdana, sans-serif; }   input { margin : 2px; }   .validationError { font-size: 0.8em; color: red; }   .validationSummary { margin : 5px; padding : 5px; background-color : red; color : white; }   .validationSummary ul { list-style : none; }   Appliquez le style « Site.css » à la forme « Default.aspx » Exécutez l’application en appuyant sur « F5 » Pour télécharger le code cliquez ici

Tutoriel 4.2–Utilisation des pages maitre.

L’objectif de ce tutoriel (module 4) est d’apprendre à utiliser les pages maitres pour uniformiser les pages d’une application web. Pour ce, nous créerons trois pages web dont la page d’accueil avec une structure à deux niveaux en utilisant les pages maitre imbriquées. Etape 1 – Créer une page maître Lancez VS 2012 Choisir Fichier -> Nouveau -> Application ASP.NET vide Entrez « TestMaster » dans la zone « Nom » Cliquez sur OK Cliquez sur le bouton droit sur « TestMaster » dans l’explorateur de solutions Sélectionnez « Ajouter un nouvel élément » Dans le modèle sélectionnez « Page Maître » Dans la zone « Nom », entrez « Main » Appuyez sur OK Ouvrez la page maître en mode source Vérifiez que VS l’a créée avec la directive « Master » au lieu de « Page » <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Main.master.cs" Inherits="TestMaster.Main" %> Vérifiez que VS a inséré deux conteneurs (ContentPlaceHolder) dans la page maître Insérez une balise de type entête (Header) juste avant le second conteneur avec la classe CSS «header » Entourez le deuxième conteneur dans une div avec la classe « content » <form id="form1" runat="server"> <header class="header"> </header> <div class="content"> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> Ouvrez la page maître en mode conception Ajoutez un menu dans l’entête en glissant un menu à partir de la boîte à outils Dans la zone de propriétés du menu, cliquez sur « Items » Ajoutez deux éléments « Page 1 » et « Page 2 » Dans l’élément « Page 2 », ajoutez deux sous-éléments, « Page 2.1 » et « Page 2.2 » Cliquez sur OK Modifiez la page maître en mode source comme suit : <form id="form1" runat="server"> <header class="header"> <asp:Menu ID="Menu1" runat="server" CssClass="siteMenu" ForeColor="White" Orientation="Horizontal"> <DynamicHoverStyle BackColor="#FFFFB0" ForeColor="#666666" /> <Items> <asp:MenuItem Text="Page 1" Value="Page 1" NavigateUrl="~/Default.aspx"></asp:MenuItem> <asp:MenuItem Text="Page 2" Value="Page 2"> <asp:MenuItem Text="Page 2.1" Value="Page 2.1" NavigateUrl="~/Page21.aspx"></asp:MenuItem> <asp:MenuItem Text="Page 2.2" Value="Page 2.2" NavigateUrl="~/Page22.aspx"></asp:MenuItem> </asp:MenuItem> </Items> <LevelMenuItemStyles> <asp:MenuItemStyle BackColor="#990000" Font-Underline="False" HorizontalPadding="10px" ItemSpacing="20px" VerticalPadding="10px" /> <asp:MenuItemStyle BackColor="#990000" Font-Underline="False" HorizontalPadding="10px" ItemSpacing="20px" VerticalPadding="10px" /> </LevelMenuItemStyles> <LevelSelectedStyles> <asp:MenuItemStyle BackColor="#FFFFB0" Font-Underline="False" ForeColor="Gray" /> <asp:MenuItemStyle BackColor="#FFFFB0" Font-Underline="False" ForeColor="#666666" /> </LevelSelectedStyles> <StaticHoverStyle BackColor="#FFFFB0" ForeColor="#666666" /> </asp:Menu> </header> <div class="content"> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> Dans le projet, ajoutez une feuille de style appelée « Site.css » Modifiez le CSS comme suit : body { padding: 0; margin: 0; font-family: 'Gill Sans' , 'Gill Sans MT' , Calibri, 'Trebuchet MS' , sans-serif; background-color: #808080; }   .header { min-height: 75px; background-color: #115E66; }   .siteMenu { margin-top : 65px; }   div.content { padding : 15px; }   div.lateralBar { background-color: #99CCFF; margin : 5px; width : 160px; height : 140px; float : left; }   div.innerContent { padding : 15px; float : left; }   div.clear { clear : both; } Ouvrez la page maître en mode conception Faites glisser la feuille de style sur la page maître afin d’appliquer les styles Dans l’explorateur de solutions, cliquez pour ajouter un nouvel élément au projet « TestMaster » Dans le modèle, choisissez « Forme Web » utilisant une page maître Entrez default dans la zone « Nom » Apparaît ensuite une boîte de sélection de la page maître à appliquer. Sélectionnez « Main » Cliquez ensuite sur « OK » Ouvrez Default.aspx en mode source Vérifiez que la directive « Page » contient une autre propriété appelée « MasterPageFile » <%@ Page Title="" Language="C#" MasterPageFile="~/Main.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestMaster.Default" %> Ouvrez « Default.aspx » en mode conception Entrez « Bienvenue dans la page 1 dans la page principale Exécutez pour voir Etape 2 : Création de pages maîtres imbriquées L’objectif de cette étape est de créer un deuxième niveau de navigation en utilisant les pages maître imbriquées. Dans l’explorateur de solutions, ajoutez un nouvel élément au projet « TestMaster » Sélectionnez « Page Maître Imbriquée » dans le modèle Dans la zone « Nom » entrez « Child » Cliquez sur OK Ouvrez la page « Child » en mode source Vérifiez que la directive est « Master » et que cette directive possède une propriété « MasterPageFile » <%@ Master Language="C#" MasterPageFile="~/Main.Master" AutoEventWireup="true" CodeBehind="Child.master.cs" Inherits="TestMaster.Child" %> Dans le deuxième composant « Content » ajoutez trois « div » avec les classes « lateralBar », « innerContent » et « clear » respectivement Modifiez le code comme suit : <div class="lateralBar"> <ul> <li> Sous-Menu 1 </li> <li> Sous-Menu 2 </li> </ul> </div> <div class="innerContent"> </div> <div class="clear"></div> Ouvrez la page maître Child en mode conception A partir de la boîte à outils, faites glisser un composant « ContentPlaceHolder » à l’intérieur de la div « innerContent » Créez une forme web de contenu « Page21 » avec pour page maître « Child » Insérez « Bienvenue dans la page 2.1 » dans cette page De la même façon, créer une forme web de contenu « Page22 » avec le message « Bienvenue dans la page 2.2 » Exécutez en appuyant sur « F5 » Pour télécharger le code, cliquez ici

Tutoriel 4.1 - Navigation et Passage d’information

L’objectif de ce tutoriel, premier du module 4, est de voir les différents mécanismes permettant de naviguer entre des pages et de passer des informations entre ces pages. Les différents mécanismes serviront à afficher une liste de film, à modifier des films, à mettre à jour et à supprimer des films. Etape 1 – Créer une application ASP.NET vide et faire un lien entre deux pages L’objectif de cette étape est de montrer comment naviguer entre deux pages en utilisant le composant « HyperLink ». Lancez VS 2012 Choisir Fichier -> Nouveau -> Application ASP.NET vide Entrez « Navigation » dans la zone « Nom » Cliquez sur OK Dans l’explorateur de solutions, cliquez sur le bouton droit sur le projet puis sélectionnez : Ajout à Forme Web Dans la zone nom, entrez « Default » Ajoutez une autre forme appelée « Liste » Ouvrez « Default.aspx » en mode conception Ajoutez un contrôle « HyperLink » dans la page Dans la propriété « Text » entrez « Liste » Cliquez sur la propriété « NavigateUrl » puis sur le bouton « Parcourir » Sélectionnez la page « List.aspx » Cliquez sur « OK » Exécutez l’application Examinez comment le lien permet de rediriger vers une autre page   Etape 2 : Ajout de traitements de modification et de suppression dans le service de films L’ancienne version de la bibliothèque ne disposait pas de fonctions d’ajout ou de suppression de films. L’objectif de cette étape est d’intégrer ces fonctions. Dans l’explorateur de solutions, cliquez sur le bouton droit sur la solution (pas le projet) Cliquez avec le bouton droit puis sélectionnez, « Ajouter un Projet Existant » Parcourir afin de trouver le projet « Bibliotheque » utilisé précédemment Cliquez sur le projet « Navigation » puis ajouter une classe globale d’application « Global.asax » Dans le projet « Navigation », ajoutez une référence vers le projet « Bibliotheque » Modifiez « Global.asax » comme suit : protected void Application_Start(object sender, EventArgs e) { ServicesDonnees.SetFilmService(new FilmService()); } Ouvrez le fichier « IFilmService.cs » dans le projet « Bibliotheque » et modifiez le comme suit : public interface IFilmService { /// <summary> /// ajoute un film /// </summary> /// <param name="f"></param> void Add(Film f);   /// <summary> /// supprimer un film /// </summary> /// <param name="f"></param> void Delete(Film f);   /// <summary> /// renvoie un film à partir de son numéro /// </summary> /// <param name="numero"></param> /// <returns></returns> Film GetFilm(int numero);   /// <summary> /// renvoie tous les films /// </summary> /// <returns></returns> IEnumerable<Film> GetAll(); } Ouvrez la classe « FilmService » et modifiez-la comme suit : public class FilmService : IFilmService { private List<Film> _liste = new List<Film>();   public FilmService() { // ajout d'exemple AjouterFilm(1, "Avatar", 2011); AjouterFilm(2, "Salt", 2011); AjouterFilm(3, "The Dark Knight Rises", 2012); AjouterFilm(4, "Alien", 1979); }   private void AjouterFilm(int numero, string titre, int annee) { var film = new Film(numero, titre, annee); _liste.Add(film); }   public Film GetFilm(int numero) { return _liste.FirstOrDefault(e => e.Numero == numero); }   public IEnumerable<Film> GetAll() { return _liste; }   public void Add(Film f) { _liste.Add(f); }     public void Delete(Film f) { _liste.Remove(f); } } Appuyez sur « F6 » pour vérifier que le code compile correctement. Etape 3 : Affichage de la liste des films L’objectif de cette étape est d’afficher la liste des films existants sous forme de tableau. Ça permettra entre autre de manipuler le composant « Table ». Ouvrez la forme « List.aspx » en mode conception et ajoutez un label avec l’id « lblMessage » et une table comme suit : <form id="form1" runat="server">   <asp:Label ID="lblMessage" runat="server" Text="Label"></asp:Label> <asp:Table ID="Table1" runat="server"> </asp:Table>   </form> Modifiez l’évènement « PageLoad » de la page « List » comme suit : Appuyez ensuite sur « F5 » pour vérifier que ça exécute correctement protected void Page_Load(object sender, EventArgs e) { lblMessage.Visible = false; var row = new TableRow(); var cell = new TableCell(); cell.Text = "Num"; row.Cells.Add(cell); cell = new TableCell(); cell.Text = "Titre"; row.Cells.Add(cell); cell = new TableCell(); cell.Text = "Année"; row.Cells.Add(cell); cell = new TableCell(); row.Cells.Add(cell); cell.Text = "Détails"; Table1.Rows.Add(row); foreach (Film f in ServicesDonnees.FilmService.GetAll()) { row = new TableRow(); cell = new TableCell(); cell.Text = f.Numero.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = f.Titre; row.Cells.Add(cell); cell = new TableCell(); cell.Text = f.Annee.ToString(); row.Cells.Add(cell); cell = new TableCell(); var link = string.Format("Edit.aspx?mode=edit&numero={0}", f.Numero); cell.Text = string.Format("<a href=\"{0}\">Modifier", link); row.Cells.Add(cell); Table1.Rows.Add(row); } }   Etape 4 : Création de la page d’édition de films L’objectif de cette étape est de créer une page permettant de modifier ou d’ajouter des films. Pour connaître le mode en cours (insertion ou modification), on utilise la variable « mode » qui est transmise sous forme de chaine de requête avec l’URL. En mode modification, le film à modifier est connu en utilisant la chaîne de requête « numero ». Les différents messages seront transmis à la page d’accueil en utilisant les variables de session. Dans le projet « Navigation » ajoutez une page qui s’appelle « Edit.aspx » Insérez des contrôles dans Edit.aspx de façon à pouvoir ajouter ou modifier un film comme suit : <form id="form1" runat="server"> <div>   <asp:Label ID="lblMessage" runat="server" Text="Label" ForeColor="#FF3300"></asp:Label><br />   <asp:Label ID="Label1" runat="server" Text="Numéro :"></asp:Label> <asp:TextBox ID="txtNumero" runat="server"></asp:TextBox> <br /> <asp:Label ID="Label2" runat="server" Text="Titre : "></asp:Label> <asp:TextBox ID="txtTitre" runat="server"></asp:TextBox> <br /> <asp:Label ID="Label3" runat="server" Text="Annee :"></asp:Label> <asp:TextBox ID="txtAnnee" runat="server"></asp:TextBox> <br /> <asp:Button ID="Button1" runat="server" Text="Enregistrer" /> </div>   </form>     Modifiez l’évènement « Page_Load » de la page « Edit.aspx » comme suit : protected void Page_Load(object sender, EventArgs e) { lblMessage.Visible = false; var editMode = Request.QueryString["mode"]; Session["message"] = null; Film film = null; if (editMode == "edit") { var numero = int.Parse(Request.QueryString["numero"]); film = ServicesDonnees.FilmService.GetFilm(numero); } if (!IsPostBack) { if (editMode == "edit") { // afficher le fim txtNumero.Text = film.Numero.ToString(); txtTitre.Text = film.Titre; txtAnnee.Text = film.Annee.ToString(); } } else { try { if (editMode == "add") film = new Film(); film.Numero = int.Parse(txtNumero.Text); film.Titre = txtTitre.Text; film.Annee = int.Parse(txtAnnee.Text); if (editMode == "add") { ServicesDonnees.FilmService.Add(film); Session["message"] = "Film ajoute avec succes"; } else Session["message"] = "Film modifié avec succes"; Response.Redirect("List.aspx");   } catch { lblMessage.Text = "Veuillez vérifiez vos données"; lblMessage.Visible = true; } } La page vérifie qu’elle est en mode édition ou ajout en examinant la variable de requête « mode » Si elle est en mode « modification », elle récupère l’id du film à modifiez en examinant la chaîne de requête « numero » puis affiche les informations de ce film En mode postback, selon on est en mode ajout ou modification, la page ajoute ou modifie la film puis redirige vers la page « List » Si l’opération s’est bien déroulée, la page « Edit » communique un message vers la page « List » en utilisant la propriété « Session » Appuyez sur « F6 » pour vérifier que le code compile Ouvrez la page « List.aspx » comme suit : <form id="form1" runat="server">   <asp:Label ID="lblMessage" runat="server" Text="Label"></asp:Label> <asp:Table ID="Table1" runat="server"> </asp:Table> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Edit.aspx?mode=add">Ajout</asp:HyperLink> <br /> <asp:TextBox ID="txtEdit" runat="server"></asp:TextBox> <asp:Button ID="btnSupprimer" runat="server" PostBackUrl="~/Delete.aspx" Text="Supprimer" /> </form> Ouvrez le fichier code behind « List.aspx.cs » Insérez le code suivant juste après la première instruction de la méthode if (Session["message"] != null) { lblMessage.Text = Session["message"].ToString(); lblMessage.Visible = true; Session["message"] = null; } Exécutez l’application en appuyant sur F5 et vérifiez que l’application peut ajouter et supprimer des films et que les messages de succès s’affichent correctement. Etape 5 : Communication entre pages en utilisant « PostbackUrl » L’objectif de cette étape est d’implémenter la suppression qui est gérée par une autre page. On utilise la propriété « PostbackUrl » et « PreviousPage » pour passer à la page de suppression les informations concernant le film à supprimer. Ouvrez la page « List.aspx » en mode source Vérifiez la propriété « PostBackUrl » du bouton « supprimer » <asp:Button ID="btnSupprimer" runat="server" PostBackUrl="~/Delete.aspx" Text="Supprimer" /> Dans le projet « Navigation », ajoutez une forme web appelée « Delete.aspx » Changez l’évènement Page_Load de cette page comme suit : protected void Page_Load(object sender, EventArgs e) { var page = PreviousPage as List; if (page == null) { Session["message"] = "erreur"; Response.Redirect("List.aspx"); return; } var textBox = page.FindControl("txtEdit") as TextBox; int numero; if (!int.TryParse(textBox.Text, out numero)) { Session["message"] = "entrez une valeur numérique"; Response.Redirect("List.aspx"); } else { var film = ServicesDonnees.FilmService.GetFilm(numero); if (film == null) { Session["message"] = "Film non trouvé"; Response.Redirect("List.aspx"); } else { ServicesDonnees.FilmService.Delete(film); Session["message"] = "Film supprimé avec succès"; Response.Redirect("List.aspx"); } } } Vérifiez l’utilisation de la propriété « PreviousPage » La valeur du numéro du film est récupérée en utilisant la méthode « FindControl » Exécutez l’application en appuyant sur « F5 » Vérifiez que la suppression d’un film se déroule bien et qu’un message apparait. Etape 6 : Intégration des contrôles utilisateur L’objectif de cette étape est de réutiliser un contrôle utilisateur dans le but d’éviter la redondance du code. Comme exemple, chacune des pages du site contiendra un contrôle permettant à l’utilisateur d’ajouter un commentaire. Dans l’explorateur de solutions, ajoutez un nouvel élément Dans le modèle, choisissez « Contrôle Utilisateur Web » Dans la zone « Nom », entrez « CommentsControl »   Ouvrez le contrôle en mode source Vérifiez qu’il y a une directive « Control » à la place de la directive « Page » Ajoutez un label et une zone de texte multiligne dans le contrôle comme suit : <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CommentControl.ascx.cs" Inherits="Navigation.CommentControl" %> <asp:Label ID="Label1" runat="server" Text="Votre commentaire :"></asp:Label> <br /> <asp:TextBox ID="TextBox1" runat="server" Rows="4" TextMode="MultiLine" Width="338px"></asp:TextBox> Ouvrez « List.aspx » en mode conception Par un glisser déposer, glissez « CommentsControl » à la fin de la page Vérifiez que Visual Studio a ajouté la directive « Register » au début du fichier, en dessous de la directive « Control » <%@ Register src="CommentControl.ascx" tagname="CommentControl" tagprefix="uc1" %> Vérifiez dans le code, qu’un composant CommentsControl a été ajouté comme suit : <uc1:CommentControl ID="CommentControl1" runat="server" /> Vérifiez que la page « List.aspx » ressemble à ceci :   De la même façon, ajoutez un contrôle « CommentsControl » dans la page « Edit.aspx » Vérifiez l’exécution et l’intégration du contrôle en cliquant sur « F5 »   Pour télécharger le source, cliquez ici

Tutoriel 3.1–Intégration de traitements

L’objectif de ce tutoriel du module 3 est de voir comment intégrer les traitements dans les applications ASP.NET. Etape 1 – Créer une application ASP.NET vide Lancez VS 2012 Choisir Fichier -> Nouveau -> Application ASP.NET vide Entrez « ProgrammationWeb » dans la zone « Nom » Cliquez sur OK Dans l’explorateur de solutions, cliquez sur le bouton droit sur le projet puis sélectionnez : Ajout à Forme Web Dans la zone nom, entrez « Default » Cliquez sur OK La forme web est affichée en mode source Appuyez sur « F7 » pour accéder au code behind Constatez le code généré comme suit : public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {   } } Dans l’explorateur de solutions, développer Default.aspx Remarquez la présence des fichiers : « Default.aspx.cs » et « Defaut.aspx.designer.cs » Ouvrez « Default.aspx.designer.cs » et examinez son contenu Revenez sur « Default.aspx » et ajoutez un « Label » Re-Vérifiez le contenu du fichier « Default.aspx.designer.cs » Remarquez que la classe « Default » est partielle et qu’elle est étalée sur deux fichier (code behind et designer). public partial class Default {   /// <summary> /// form1 control. /// </summary> /// <remarks> /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// </remarks> protected global::System.Web.UI.HtmlControls.HtmlForm form1;   /// <summary> /// Label1 control. /// </summary> /// <remarks> /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// </remarks> protected global::System.Web.UI.WebControls.Label Label1; } Supprimez le « label » qui vient d’être ajouté Etape 2 : Ajout d’une bibliothèque de classes L’objectif de cette étape est de créer une bibliothèque de classe contenant plusieurs classes métier dont « Film » et « FilmService ». En utilisant « FilmService », l’utilisateur pourra accéder et chercher des films. Dans l’explorateur de solutions, cliquez sur la solution (pas le projet) avec le bouton droit Sélectionnez Ajout –> Nouveau Projet Dans le modèle, choisissez « Bibliothèque de classes » Dans la zone « Nom » entrez « Bibliotheque » Cliquez sur « OK » La solution est maintenant composée de deux projets au lieu d’un seul Remarquez la présence de la classe « Class1 » créée par défaut Depuis l’explorateur de solutions, supprimez le fichiers Class1 Dans l’explorateur de solutions, cliquez sur « Bibliotheque » avec le bouton droit puis cliquez « Ajout » à « Classe » Dans la zone « Nom » entrez « Film » Cliquez sur OK Dans le fichier Film.cs, remplacez la classe « Film » comme suit : public class Film {   public Film() { }   public Film(int numero, string titre, int annee) { this.Numero = numero; this.Annee = annee; this.Titre = titre; }   public int Numero { get; set; }   public int Annee { get; set; }   public string Titre { get; set; }   } Compilez en appuyant sur « F6 », vérifiez qu’il n’y a pas d’erreurs Dans l’explorateur de solutions, cliquez sur le bouton droite sur « Bibliotheque » Cliquez sur « Ajouter »à « Nouvel Elément » Choisissez le modèle « Interface » Dans la zone « Nom », entrez « IFilmService » Cliquez sur « OK » Remplacez le code de « IFilmService » comme suit :   public interface IFilmService { /// <summary> /// renvoie un film à partir de son numéro /// </summary> /// <param name="numero"></param> /// <returns></returns> Film GetFilm(int numero);   /// <summary> /// renvoie tous les films /// </summary> /// <returns></returns> IEnumerable<Film> GetAll(); } Ajoutez une classe au projet « Bibliotheque » appelée « FilmService » Modifiez cette classe de façon à ce qu’elle hérite de l’interface « IFilmService » Remarquez le SmartTag bleu s’affichant en dessous de « IFilmService » Cliquez sur le « SmartTag » puis sélectionnez « Implémenter IFilmService» Modifiez la classe « FilmService » comme suit : public class FilmService : IFilmService { private List<Film> _liste = new List<Film>();   public FilmService() { // ajout d'exemple AjouterFilm(1, "Avatar", 2011); AjouterFilm(2, "Salt", 2011); AjouterFilm(3, "The Dark Knight Rises", 2012); AjouterFilm(4, "Alien", 1979); }   private void AjouterFilm(int numero, string titre, int annee) { var film = new Film(numero, titre, annee); _liste.Add(film); }   public Film GetFilm(int numero) { return _liste.FirstOrDefault(e => e.Numero == numero); }   public IEnumerable<Film> GetAll() { return _liste; } } Vérifiez que le code compile en appuyant sur le bouton « F6 ». Etape 3 : Ajout du « Global.asax » et utilisation de la bibliothèque de classes L’objectif de cette étape est de configurer le service de films dans l’initialisation de l’application en utilisant « Global.asax ». Dans le projet « Bibliotheque », ajoutez une classe appelée « ServicesDonnees » Modifiez la classe ServiceDonnees comme suit : Vérifiez que le code compile en appuyant sur « F6 » public static class ServicesDonnees { public static void SetFilmService(IFilmService instance) { FilmService = instance; }   public static IFilmService FilmService { get; private set; } } Dans l’explorateur de solutions, cliquez sur le bouton droit sur le projet « ProgramationWeb » Sélection Ajouter à Nouvel Elément Choisissez le modèle « Classe Globale d’Application » Cliquez sur « OK » Dans l’explorateur de solutions, cliquez sur le bouton droit sur le noeau « Références » se trouvant dans le projet « ProgrammationWeb » Sélectionnez « Ajouter une référence » Dans le panneau à gauche, cliquez sur « Solution » Cochez le projet « Bibliotheque » Appuyez sur « OK » Les classes de « Bibliotheque » sont désormais utilisables dans l’application web Dans l’explorateur, double-cliquez sur « Global.asax » Placez le curseur dans la méthode « Application_Start » Tapez « ServicesDonnees » Remarquez le SmartTag qui apparaît, cliquez sur le SmartTag Sélectionnez « using Bibliotheque » Remarquez que « Bibliotheque » a été ajouté à la liste des « using » au début du fichier Modifiez le fichier comme suit : Vérifiez que le code compile en appuyant sur « F6 » public class Global : System.Web.HttpApplication {   protected void Application_Start(object sender, EventArgs e) { ServicesDonnees.SetFilmService(new FilmService()); }   protected void Session_Start(object sender, EventArgs e) {   }   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) {   } } Etape 4 : Cycle de vie d’une page L’objectif de cette étape est d’utiliser l’évènement « Page_Load » dans les deux situations : en mode normal pour initialiser la page et en mode « Postback » pour chercher le numéro entré dans la zone de texte. Ouvrez Default.aspx en mode conception Faites glisser une zone de texte, un bouton, un label et un autre bouton et arrangez-les comme suit : <form id="form1" runat="server"> <div>   <asp:Label ID="Label1" runat="server" Text="Numéro :"></asp:Label> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="btnChercher" runat="server" Text="Chercher" /> <br /> <asp:Label ID="lblMessage" runat="server" ForeColor="Red" Text="LabelMessage"></asp:Label> <br /> <asp:Button ID="btnDetails" runat="server" OnClick="btnDetails_Click" Text="Détails" UseSubmitBehavior="False" Visible="False" /> <br />   </div> </form>   Modifiez Page_Load comme suit : lblMessage.Visible = false; btnDetails.Visible = false; if (IsPostBack) { int numero; if (int.TryParse(TextBox1.Text, out numero)) { var film = ServicesDonnees.FilmService.GetFilm(numero); if (film != null) { btnDetails.Text = "Détails sur le film " + numero.ToString(); btnDetails.Visible = true; } else ShowMessage("film non trouvé"); } else ShowMessage("Veuillez entrer une valeur numérique correcte"); } Ajoutez la méthode ShowMessage comme suit : private void ShowMessage(string message) { lblMessage.Text = message; lblMessage.Visible = true; } Exécutez en appuyant sur « F5 » Etape 5 : Contrôles Orientés Serveur L’objectif de cette étape est de gérer les actions des utilisateurs de l’application en implémentant des évènements des contrôles orientés serveur. Ajouter un panneau à la fin de la forme « Default.aspx » Ajoutez des labels de la façon suivante : <asp:Panel ID="PanelInfo" runat="server"> <asp:Label ID="Label3" runat="server" Text="Numéro : "></asp:Label> <asp:Label ID="lblNumero" runat="server" Text="Label"></asp:Label> <br /> <asp:Label ID="Label4" runat="server" Text="Titre : "></asp:Label> <asp:Label ID="lblTitre" runat="server" Text="Label"></asp:Label> <br /> Année : <asp:Label ID="lblAnnee" runat="server" Text="Label"></asp:Label> </asp:Panel> Changez la méthode Page_Load comme suit : protected void Page_Load(object sender, EventArgs e) { lblMessage.Visible = false; btnDetails.Visible = false; PanelInfo.Visible = false; if (IsPostBack) { int numero; if (int.TryParse(TextBox1.Text, out numero)) { var film = ServicesDonnees.FilmService.GetFilm(numero); if (film != null) { btnDetails.Text = "Détails sur le film " + numero.ToString(); btnDetails.Visible = true; lblNumero.Text = numero.ToString(); lblAnnee.Text = film.Annee.ToString(); lblTitre.Text = film.Titre.ToString(); } else ShowMessage("film non trouvé"); } else ShowMessage("Veuillez entrer une valeur numérique correcte"); } } Doublez-cliquez sur le bouton « détails » Dans l’évènement généré, entrez le code suivant : protected void btnDetails_Click(object sender, EventArgs e) { PanelInfo.Visible = true; } Exécutez en appuyant sur F5 Pour télécharger le code source : cliquez ici