Tutoriel5-Créer Une Application Web Avec
Tutoriel5-Créer Une Application Web Avec
Tutoriel5-Créer Une Application Web Avec
Dans ce tutoriel nous allons créer une application web de gestion de voitures de collection en
ASP.NET Core MVC avec un modèle, un contrôleur et des vues
Dans la fenêtre qui suit choisissez le modèle "Application web (Model-View-Controller)" puis Créer
1/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
2. Exécuter l'application
Vous disposez maintenant d'une application web fonctionnelle créée selon le modèle MVC, cette
application de base constitue un bon point de départ, Vous pouvez la tester : appuyez sur Ctrl+F5
pour exécuter sans le débogueur.
Visual Studio affiche la boîte de dialogue suivante :
2/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
Le format de routage des requêtes est défini dans la méthode Configure() du fichier Startup.cs :
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
4. Ajouter un contrôleur
3/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
namespace Voitures.Controllers
{
public class VoituresController : Controller
{
public string Index()
{
return "Liste des voitures";
}
4/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
Nous voulons maintenant les collectionneurs de la marque de voitures Peugeot année 1975
Nous allons devoir passer deux arguments à la méthode ListeCollectionneurs() : marque et année
5/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
@{
ViewData["Title"] = "Index";
}
<h2>Belle vue</h2>
<p>Liste des collectionneurs</p>
Pour charger cette vue nous allons modifier la méthode d'action Index du contrôleur
VoituresController comme ceci :
6/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
Nous allons maintenant ajouter une option "Liste" dans le menu principal de l'application
Ouvrez la page layout du site Views/Shared/_Layout.cshtml et ajoutez un lien href après le lien
"Home" :
<li><a asp-area="" asp-controller="Voitures" asp-action="Index">
Liste</a></li>
Vous avez remarqués les attributs "asp-controller" et "asp-action" dans les liens hrefs du menu ?
Ces attributs disent simplement à MVC quelle méthode d'action exécuter sur quel contrôleur
Les Layouts vous permettent de spécifier votre HTML dans un emplacement unique une fois pour
toute, puis de l'appliquer à plusieurs pages, MVC va chercher le fichier HTML de la vue demandée et
va l'intégrer à l'emplacement de la directive @RenderBody() du layout avant d'envoyer le résultat au
navigateur
Notre application MVC a une vue "V" et un contrôleur "C", mais pas encore de modèle "M"
Dans une application MVC le contrôleur récupère les données d'une source de données à travers un
modèle de données et détermine quelle vue envoyer au navigateur, les modèles de vue Razor ne
doivent pas exécuter de logique métier
Avant de créer le modèle de données, il est important que vous compreniez le mécanisme de
passage de données du contrôleur à la vue.
7/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
Le dictionnaire ViewData contient maintenant les données que nous voulons passer à la vue, à
savoir : la marque et l'année.
Dans le dossier "Voitures" ajoutez un nouvel élément de type "Vue Razor" et appelez-le :
ListeCollectionneurs.cshtml et collez dedans ceci :
@{
ViewData["Title"] = "Liste des collectionneurs";
}
<h2>Liste des collectionneurs</h2>
<ul>
@for (int i = (int)ViewData["annee"]; i <= DateTime.Now.Year - 20; i++)
{
<li>de <b>@ViewData["marque"]</b> année @i</li>
}
</ul>
8/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
7. Ajouter un modèle
Nous allons utiliser le framework de mapping relationnel d'objets: Entity Framework Core
Ajoutez une classe "Voiture.cs" dans le dossier Models (Ce sera notre modèle de données)
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Voitures.Models
{
public class Voiture
{
public int Id { get; set; }
public string Nom { get; set; }
public string Marque { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal Prix { get; set; }
[Display(Name = "Date de fabrication")]
[DataType(DataType.Date)]
public DateTime DateFabrication { get; set; }
}
}
Nous avons utilisé l'attribut DataType sur le champ DateFabrication pour spécifier le type de données
Date au lieu de DateTime, l'utilisateur n'a pas besoin de saisir l'heure à laquelle la voiture a été
fabriquée
L'attribut Display spécifie un nom alternatif à afficher pour le nom du champ (dans le cas présent,
"Date de fabrication" au lieu de "DateFabrication").
L'attribut Column est nécessaire pour qu'Entity Framework Core puisse mapper le champ Prix en
devise dans la base de données
Nous avons notre classe de définition, nous allons maintenant générer le modèle pour les opérations
CRUD de base (création, lecture, mise à jour et suppression)
Dans l'explorateur de solutions faites un clique droit sur Contrôleurs > Ajouter > Nouvel élément
généré automatiquement
9/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
10/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
Add-Migration Initial
Update-Database
11/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
Allez voir dans Startup.cs : le contexte de la base de données est inscrit au démarrage de l'application
par un mécanisme d'injection de dépendances, il sera passé ultérieurement aux contrôleurs des
pages Rasor qui en ont besoin
Le contexte de base de données a été passé au contrôleur car il sera utilisé dans chacune des
méthodes CRUD
12/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
@model IEnumerable<GestionVoitures.Models.Voiture>
...
@foreach (var item in Model) {
L'instruction @model en haut du fichier de vue sert à spécifier le type d'objet attendu par la vue et
permet d'accéder aux voitures que le contrôleur a passées à la vue en utilisant un objet fortement
typé (Model)
Dans le menu Affichage, ouvrez l'Explorateur d'objets SQL Server et vérifiez que la base de données
VoituresDBContext a bien été créée
Maintenant nous allons peupler la base de données avec une liste de voitures
Créez une classe SeedData.cs dans Models
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
namespace GestionVoitures.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new VoituresDBContext(
serviceProvider.GetRequiredService<
DbContextOptions<VoituresDBContext>>()))
{
// Chercher n'importe quelle voiture.
if (context.Voiture.Any())
{
return; // la base de données est déjà peuplée
}
context.Voiture.AddRange(
new Voiture
{
Nom = "Mustang",
Marque = "Ford",
Prix = 10000,
13/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
DateFabrication = DateTime.Parse("1966-1-12")
},
new Voiture
{
Nom = "T",
Marque = "Ford",
Prix = 10000,
DateFabrication = DateTime.Parse("1911-1-12")
},
new Voiture
{
Nom = "4L",
Marque = "Renault",
Prix = 10000,
DateFabrication = DateTime.Parse("1968-1-12")
},
new Voiture
{
Nom = "1000",
Marque = "Sicma",
Prix = 10000,
DateFabrication = DateTime.Parse("1968-1-12")
},
new Voiture
{
Nom = "Traction",
Marque = "Citroen",
Prix = 10000,
DateFabrication = DateTime.Parse("1938-1-12")
}
);
context.SaveChanges();
}
}
}
namespace GestionVoitures
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context =
services.GetRequiredService<GestionVoitures.Models.VoituresDBContext>();
context.Database.Migrate();
GestionVoitures.Models.SeedData.Initialize(services);
}
catch (Exception ex)
14/15
Module au choix : Programmation .Net/C# ENIT AU 2020/2021
Exécutez le programme
La base de données a été peuplée avec AddRange, si la base est déjà peuplée il ne se passera rien
Dans le menu Affichage, ouvrez l'Explorateur d'objets SQL Server et vérifiez que la base de données a
bien été peuplée
15/15