Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 4 : Implémentation des fonctionnalités CRUD

Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d’une application CRUD avec WebMatrix, Razor et Entity Framework.

– Part 1 : introduction et présentation des outils

– Part 2 : création de l’application et définition du modèle objet

– Part 3 : création du DBContex et du Repository

Dans les parties précédentes, nous nous sommes familiarisés avec outils utilisés, nous avons procédé à la création de l’application, à la définition du modèle objet qui sera utilisé ainsi qu’à la création du DBContex et du Repository.

Dans cette partie, nous allons nous plonger dans le vif du sujet en implémentant les interfaces Web pour la lecture, la modification, la suppression et l’enregistrement des données dans votre base de données.

Vous allez dans un premier temps créé un nouveau dossier Personne qui contiendra tous les fichiers pour la gestion des personnes.

1 – Implémentation de la grille des données

Dans le dossier Personne, ajoutez un nouveau fichier Index.cshtml.

Vous allez ensuite ajouter en début de ce fichier les lignes de code permettant de retourner la liste des personnes qui sont enregistrées dans la base de données. Cette liste sera par la suite affichée grâce au Helper Razor WebGrid, qui va être instancié en passant en paramètre la collection des données qui doivent être affichées et le nombre d’éléments sur une page.


var pr = new PersonneRepository();
var grid = new WebGrid(pr.GetAll(),rowsPerPage : 10);

Avant d’afficher la grille, vous allez procéder au formatage de celle-ci en définissant les colonnes qui seront affichées et en ajoutant notamment de nouvelles colonnes pour l’édition, la consultation et la suppression d’une ligne de la grille.

Le code pour effectuer cela est le suivant :

@grid.GetHtml(tableStyle:"grid",
headerStyle:"head",
alternatingRowStyle: "altrow",
columns: grid.Columns(
grid.Column("Nom","Nom"),
grid.Column("Prenom", "Prénom"),
grid.Column("", "", format: @<text><a href="Edit/@item.PersonneId")>Editer</a>
| <a href="Details/@item.PersonneId")>Détails</a>
| <a href="Delete/@item.PersonneId")>Supprimer</a></text>)
)

)

Le code complet de la page Index.cshtml est le suivant :

@{
// Set the layout page and page title
Layout = "~/_SiteLayout.cshtml";
Page.Title = "Register an Account";

var pr = new PersonneRepository();
var grid = new WebGrid(pr.GetAll(),rowsPerPage : 10);

}
<hgroup class="title">
<h1>Personnes.</h1>
</hgroup>

<p><a href="Create">Ajouter un nouvel enregistrement</a></p>

@grid.GetHtml(tableStyle:"grid",
headerStyle:"head",
alternatingRowStyle: "altrow",
columns: grid.Columns(
grid.Column("Nom","Nom"),
grid.Column("Prenom", "Prénom"),
grid.Column("", "", format: @<text><a href="Edit/@item.PersonneId")>Editer</a>
| <a href="Details/@item.PersonneId")>Détails</a>
| <a href="Delete/@item.PersonneId")>Supprimer</a></text>)
)

)

La ligne de code :


<p><a href="Create">Ajouter un nouvel enregistrement</a></p>

va permettre d’ajouter les nouvelles informations sur une personne dans la BD. À l’exécution, vous obtenez le résultat suivant :

le code CSS que j’ai utilisé pour le WebGrid et qui a été défini dans le fichier Site.css pour être appliqué à toutes les grilles de l’application est le suivant :

.grid { margin: 4px; border-collapse: collapse; width: 600px; }
.head { background-color: #E8E8E8; font-weight: bold; color: #FFF; }
.grid th, .grid td { border: 1px solid #C0C0C0; padding: 5px; }
.altrow { background-color: #E8E8E8; color: #000; }

2 – Affichage détaillé

mpte tenu du fait que dans certains cas, il vous sera impossible de présenter toutes les informations sur une entité sur une ligne de la grille, un lien qui pointe sur une page  » Details  » a été introduit donc pour afficher des informations détaillées sur une personne.

Nous verrons ici comment implémenter l’interface Web de cette page. Pour cela, vous allez ajouter un nouveau fichier Edit.cshtml dans le dossier Personne.

Au début de ce fichier, vous allez déclarer une variable pour récupérer l’id qui est passé comme paramètre HTTP. La méthode Find() sera utilisée pour retourner l’élément dans la base de données dont l’identifiant est égal à celui qui est passé en paramètre.

Le code pour effectuer cela est le suivant :

int id = Request["id"].AsInt();
var pr = new PersonneRepository();
var personne = new Personne();
personne = pr.Find(id);

Il ne vous reste plus qu’à afficher les informations contenues dans la variable personne dans votre code html.

Le code complet de la page Details.cshtml est le suivant :


@{
// Set the layout page and page title
Layout = "~/_SiteLayout.cshtml";
Page.Title = "Détails";

int id = Request["id"].AsInt();
var pr = new PersonneRepository();
var personne = new Personne();
personne = pr.Find(id);

}
<hgroup class="title">
<h1>Détails.</h1>
</hgroup>
<fieldset>
<legend></legend>
<ol>
<li class="nom">
<label>Nom:</label>
<label>@personne.Nom</label>
</li>
<li class="prenom">
<label>Prénom:</label>
<label>@personne.Prenom</label>
</li>
</ol>
</fieldset>

<p><a href="Edit?id=@id">Editer</a> |
<a href="Index">Retour à la liste</a>
</p>

Ce qui permet d’obtenir le résultat suivant à l’exécution, après un clic sur le lien Détails d’une ligne de la grille contenant la liste des personnes :

3 – Enregistrement des données

Dans la page affichant la liste des personnes, vous avez ajouté un lien permettant d’accéder à la page d’ajout d’un nouvel enregistrement. Penchons-nous maintenant sur l’implémentation de cette page. Vous allez ajouter une nouvelle page dans le dossier Personne. Il suffit pour cela de faire un clic droit sur le dossier Personne, sélectionner  » New Files  » et créer un nouveau fichier  » create.cshtml  » dans la fenêtre qui va s’afficher.

Le code source du formulaire d’enregistrement d’une personne est le suivant :

<form method="post" action="">
@* Notification en cas d'erreur de validation *@
@Html.ValidationSummary("Veuillez corriger les erreurs suivantes:")

<fieldset>
<legend>Registration Form</legend>
<ol>
<li class="nom">
<label for="nom" @if(!ModelState.IsValidField("nom")){<text>class="error-label"</text>}>Nom:</label>
<input type="text" id="nom" name="nom" title="Nom" value="@nom" @Validation.GetHtml("nom") />
@Html.ValidationMessage("nom")
</li>
<li class="prenom">
<label for="prenom" @if(!ModelState.IsValidField("prenom")){<text>class="error-label"</text>}>Prénom:</label>
<input type="text" id="prenom" name="prenom" title="Prénom" value="@prenom" @Validation.GetHtml("prenom") />
@Html.ValidationMessage("prenom")
</li>
</ol>
<input type="submit" value="Enregistrer" title="Enregistrer" />

</fieldset>
</form>

Afin d’envoyer des données correctes vers votre classe entité pour laquelle vous avez défini certains champs comme obligatoires, vous devez procéder à la validation des données utilisateur.

Les méthodes @Html.ValidationSummary() et @Html.ValidationMessage() sont utilisées pour afficher les messages d’erreurs de validation à l’utilisateur.

Vous allez utiliser JQuery et les nouvelles classes de validation System.Web.WebPages.ValidationHelper et System.Web.WebPages.Validator qui ont été introduites par WebPages 2 pour effectuer en seulement quelques lignes de code, des tâches de validation de données puissantes.

Le code pour effectuer cela est le suivant :

// Ajout des scripts de validation
Scripts.Add("~/Scripts/jquery-1.6.2.min.js");
Scripts.Add("~/Scripts/jquery.validate.min.js");
Scripts.Add("~/Scripts/jquery.validate.unobtrusive.min.js");

// Validation du nom
Validation.RequireField("nom", "Le nom est obligatoire.");
// Validation du prénom
Validation.RequireField("prenom", "Le prénom est obligatoire.");

Il ne vous reste plus qu’à écrire le code permettant d’ajouter les données postées par un utilisateur dans la base de données :


var pr = new PersonneRepository();
var personne = new Personne{
Nom = nom, Prenom = prenom};
//Ajout des données sur la personne
pr.Add(personne);

Le code complet de la page Create.cshtml est le suivant :


@{
// Définition du layout et du titre de la page
Layout = "~/_SiteLayout.cshtml";
Page.Title = "Register an Account";

// initialisation des varaiables
var nom = "";
var prenom = "";

// Ajout des scripts de validation
Scripts.Add("~/Scripts/jquery-1.6.2.min.js");
Scripts.Add("~/Scripts/jquery.validate.min.js");
Scripts.Add("~/Scripts/jquery.validate.unobtrusive.min.js");

// Validation du nom
Validation.RequireField("nom", "Le nom est obligatoire.");
// Validation du prénom
Validation.RequireField("prenom", "Le prénom est obligatoire.");
//Triatement des données si s'est une requête POST
if (IsPost) {
nom = Request.Form["nom"];
prenom= Request.Form["prenom"];

if (Validation.IsValid()) {
var pr = new PersonneRepository();
var personne = new Personne{
Nom = nom, Prenom = prenom};
//Ajout des données sur la personne
pr.Add(personne);
Response.Redirect("Index");
}
};


}


<hgroup class="title">
<h1>Ajout d'un nouvel enregistrement.</h1>
>
</hgroup>

<form method="post" action="">
@* Notification en cas d'
erreur de validation *@
@Html.ValidationSummary("Veuillez corriger les erreurs suivantes:")

<fieldset>
<legend>Registration Form</legend>
<ol>
<li class="nom">
<label for="nom" @if(!ModelState.IsValidField("nom")){<text>class="error-label"</text>}>Nom:</label>
<input type="text" id="nom" name="nom" title="Nom" value="@nom" @Validation.GetHtml("nom") />
@Html.ValidationMessage("nom")
</li>
<li class="prenom">
<label for="prenom" @if(!ModelState.IsValidField("prenom")){<text>class="error-label"</text>}>Prénom:</label>
<input type="text" id="prenom" name="prenom" title="Prénom" value="@prenom" @Validation.GetHtml("prenom") />
@Html.ValidationMessage("prenom")
</li>
</ol>
<input type="submit" value="Enregistrer" title="Enregistrer" />

</fieldset>
</form>
<a href="Index">Retour à la liste</a>

À l’exécution de cette page, vous obtenez le résultat suivant :

En cas d’erreur de validation, vous aurez le résultat suivant :

4 – Modification

Après l’enregistrement des données sur une personne, voyons maintenant comment nous allons implémenter une nouvelle page permettant de procéder à la mise à jour des informations sur une personne.

Comme vous avez ajouté un lien  » Editer  » dans le tableau des personnes qui pointe sur la page  » Edit « , vous allez créer un nouveau fichier cshtml ayant ce nom.

La page doit afficher par défaut les informations qui doivent être modifiées dans des zones éditables. Vous allez donc dans un premier temps récupérer ces informations. Le code pour effectuer cela est le suivant :

int id = Request["id"].AsInt();

var db = new WebMatrixCrudAppContext();
var personne = new Personne();
personne = db.Personnes.Find(id);
// initialisation des variables
var nom = personne.Nom;
var prenom = personne.Prenom;

Le code du formulaire de modification est le suivant :

<form method="post" action="">
@* If at least one validation error exists, notify the user *@
@Html.ValidationSummary("Veuillez corriger les erreurs suivantes:")

<fieldset>
<legend>Formulaire de modification</legend>
<ol>
<li class="nom">
<label for="nom" @if(!ModelState.IsValidField("nom")){<text>class="error-label"</text>}>Nom:</label>
<input type="text" id="nom" name="nom" title="Nom" value="@nom" @Validation.GetHtml("nom") />
@Html.ValidationMessage("nom")
</li>
<li class="prenom">
<label for="prenom" @if(!ModelState.IsValidField("prenom")){<text>class="error-label"</text>}>Prénom:</label>
<input type="text" id="prenom" name="prenom" title="Prénom" value="@prenom" @Validation.GetHtml("prenom") />
@Html.ValidationMessage("prenom")
</li>
</ol>
<input type="submit" value="Modifier" title="Modifier" />

</fieldset>
</form>

Le code permettant de prendre en compte les modifications dans la base de données est le suivant

personne.Nom = nom;
personne.Prenom = prenom;
//Modification des données sur la personne
pr.Update(personne);

Le code complet de la page Edit.cshtml est le suivant :

@using System.Data
@{
// Définition du layout et du titre de la page
Layout = "~/_SiteLayout.cshtml";
Page.Title = "Modification d'une personne";


int id = Request["id"].AsInt();

var pr = new PersonneRepository();
var personne = new Personne();
personne = pr.Find(id);
// initialisation des variables
var nom = personne.Nom;
var prenom = personne.Prenom;

// Ajout des scripts de validation
Scripts.Add("~/Scripts/jquery-1.6.2.min.js");
Scripts.Add("~/Scripts/jquery.validate.min.js");
Scripts.Add("~/Scripts/jquery.validate.unobtrusive.min.js");

// Validation du nom
Validation.RequireField("nom", "Le nom est obligatoire.");
// Validation du prénom
Validation.RequireField("prenom", "Le prénom est obligatoire.");
//Traitement des données si s'est une requête POST
if (IsPost) {
nom = Request.Form["nom"];
prenom= Request.Form["prenom"];

if (Validation.IsValid()) {

personne.Nom = nom;
personne.Prenom = prenom;
//Modification des données sur la personne
pr.Update(personne);

Response.Redirect("Index");

}
};


}


<hgroup class="title">
<h1>Mise à jour des données.</h1>
</hgroup>

<form method="post" action="">
@* If at least one validation error exists, notify the user *@
@Html.ValidationSummary("Veuillez corriger les erreurs suivantes:")

<fieldset>
<legend>Formulaire de modification</legend>
<ol>
<li class="nom">
<label for="nom" @if(!ModelState.IsValidField("nom")){<text>class="error-label"</text>}>Nom:</label>
<input type="text" id="nom" name="nom" title="Nom" value="@nom" @Validation.GetHtml("nom") />
@Html.ValidationMessage("nom")
</li>
<li class="prenom">
<label for="prenom" @if(!ModelState.IsValidField("prenom")){<text>class="error-label"</text>}>Prénom:</label>
<input type="text" id="prenom" name="prenom" title="Prénom" value="@prenom" @Validation.GetHtml("prenom") />
@Html.ValidationMessage("prenom")
</li>
</ol>
<input type="submit" value="Modifier" title="Modifier" />

</fieldset>
</form>

<p>
<a href="Index">Retour à la liste</a>
</p>

À l’exécution de la page, vous obtenez le résultat suivant :

5 – Suppression

Pour finir avec la table Personnes, vous allez maintenant écrire le code permettant de supprimer un enregistrement dans la base de données. Créez pour cela une nouvelle page Delete.cshtml.

Afin d’éviter les suppressions accidentelles, vous allez dans un premier temps afficher dans cette page le récapitulatif des informations sur une personne avec un message de confirmation de suppression.

Le code pour la page Delete reprend celui de la page Edit, à la différence que vous allez ajouter dans un formulaire un bouton permettant de procéder à la suppression d’un enregistrement :

<form method="post" action="">
<p>
<input type="submit" value="Supprimer" title="Supprimer" />
<a href="Index">Retour à la liste</a>
</p>
</form>

Vous allez également ajouter dans ce fichier le code permettant de supprimer les données dans la base de données en cas de clic sur le bouton supprimer :


if(IsPost)
{
pr.Remove(personne);
Response.Redirect("Index");
}

Le code complet de la page Delete.cshtml est le suivant :

@{
// Définition du layout et du titre de la page
Layout = "~/_SiteLayout.cshtml";
Page.Title = "Détails";

//Lecture des données sur une personne
int id = Request["id"].AsInt();
var pr = new PersonneRepository();
var personne = new Personne();
personne = pr.Find(id);
//Traitement des données si s'est une requête POST
if(IsPost)
{
//Supression de l'enregistrement
pr.Remove(personne);
Response.Redirect("Index");
}

}
<hgroup class="title">
<h1>Suppression.</h1>
<h3>Êtes-vous sur de vouloir supprimer cet enregistrement ?</h3>
</hgroup>
<fieldset>
<legend></legend>
<ol>
<li class="nom">
<label>Nom:</label>
<label>@personne.Nom</label>
</li>
<li class="prenom">
<label>Prénom:</label>
<label>@personne.Prenom</label>
</li>
</ol>

</fieldset>


<form method="post" action="">
<p>
<input type="submit" value="Supprimer" title="Supprimer" />
<a href="Index">Retour à la liste</a>
</p>
</form>

Ce qui donne le résultat suivant à l’exécution :

Compte tenu du fait que l’implémentation des fonctionnalités pour la table Organismes reprend plusieurs des principes et méthodes qui ont été utilisés pour la table Personnes, nous n’allons plus revenir sur la création des pages d’affichage, d’enregistrement, de mise à jour ou de suppression d’un organisme.

Pour écrire le code de ces pages, veuillez vous référer à celui pour la table Personnes ou à défaut, regarder le code source pour ces pages dans les fichiers du projet qui sont disponibles en téléchargement à la fin de l’article.

La prochaine et dernière partie portera donc sur l’implémentation des fonctionnalités CRUD pour la table Affiliations, qui sera un peu différente puisque c’est table association.

Laisser un commentaire