29-8 Modification
La modification est très proche de la création, les principales différences étant:
- L'événement doit être chargé initialement
- Le formulaire doit être rempli avec les données de l'événement récupéré
Créer la page Edit
Créons la page Edit
permettant de modifier un événement.
- Sous le dossier
Web.Admin/Pages/Evenements
->Clic droit
->Add
->Blazor Component
- Choisir
Page
- Nommer la composante
Edit
Associer une route à la page
La route associée à la page sera: /evenements/{id:int}/edit
. On peut définir cette dernière à l'aide de @page
, tout en ajoutant le paramètre associé à bloc @code
.
@page "/evenements/{id:int}/edit"
<h1>Modifier l'événement</h1>
@code {
[Parameter]
public int Id { get; set; }
}
Ajouter un lien à partir de la page Show
vers la page Edit
Dans la page Show
, assurez-vous d'avoir un bouton "Modifier".
Dans Show
, faites ensuite en sorte que le bouton Modifier
pointe vers la page de modification:
<!-- ... -->
<div class="card-body">
<NavLink class="btn btn-primary" href="@($"/evenements/{Id}/edit")">Modifier</NavLink>
</div>
<!-- ... -->
Récupérer l'événement à modifier
Au chargement du composant, on doit récupérer le détail de l'événement à modifier via l'API (l'événement en tant que tel et la liste de villes).
Ajouter une variable pour contenir l'événement, le DTO de modification et la liste de villes
@code {
[Parameter]
public int Id { get; set; }
private EvenementDto? _evenementDto;
private ModifierEvenementDto _modifierEvenementDto = new();
private List<VilleDto>? _villes;
}
Injecter EvenementHttpClient
et VilleHttpClient
dans le composant
Pour obtenir l'événement et la liste de villes, il sera nécessaire de faire appel aux deux clients pour Evenement
et Ville
.
@page "/evenements/{id:int}/edit"
@using Snowfall.Application.Dtos.Evenements
@using Snowfall.Application.Dtos.Villes
@using Snowfall.Web.Admin.HttpClients
@inject EvenementHttpClient EvenementHttpClient
@inject VilleHttpClient VilleHttpClient
Récupérer l'événement et la liste de villes
Nous avons déjà les fonctions au niveaux des clients pour récupérer ces informations, il suffit d'appeler les fonctions respectives lors de l'initialisation du composant (OnInitializedAsync
).
Oops!, le code de cette portion a disparu, vous devrez la compléter vous-même!
@code {
[Parameter]
public int Id { get; set; }
private EvenementDto? evenementDto;
private List<VilleDto>? villes;
protected override async Task OnInitializedAsync()
{
// Oups...! Le code a disparu :(
// Récupérez l'événement et la liste de villes, puis assignez-les aux variables
}
}
Mapper le DTO d'événement vers le DTO de modification
Une fois que vous aurez récupéré le DTO de l'événement, il faut le "mapper" au DTO de modification.
Les étapes qui suivent sont importantes! Un moment d'égarement de ma part a mené à vous faire créer le fichier de configuration AutoMapper dans le projet Api
. Or, nous avons besoin de faire du mapping dans le projet Admin
. Nous allons donc déplacer le fichier de configuration AutoMapper, en plus d'installer AutoMapper dans le projet Application
afin qu'il soit accessible à toute l'application.
- Installer AutoMapper dans
Application
. Dans le projetApplication
,click droit
->Manage Nuget Packages
->RecherchezAutoMapper
->Procédez à l'ajout dans le projet - Dans Rider, déplacez le fichier
Snowfall.Web.Api/Configurations/AutoMapperConfig.cs
vers le dossierSnowfall.Application/Mappings
. Rider devrait faire le refactoring nécessaire. - Ajoutez un mappage de
EvenementDto
versModifierEvenementDto
Snowfall.Application/Mappings/AutoMapperConfig.cspublic AutoMapperConfig()
{
CreateMap<Evenement, EvenementDto>().ReverseMap();
CreateMap<CreerEvenementDto, Evenement>();
CreateMap<EvenementDto, ModifierEvenementDto>();
CreateMap<Ville, VilleDto>().ReverseMap();
} - Ajoutez AutoMapper aux services accessibles à l'injection de dépendance du projet Admin.
Snowfall.Web.Admin/Program.cs
// Injection de dépendances
builder.Services.EnregistrerServices();
builder.Services.AddAutoMapper(typeof(AutoMapperConfig)); - Injecter AutoMapper dans la page
Snowfall.Web.Admin/Pages/Evenements/Edit.razor
@page "/evenements/{id:int}/edit"
@using AutoMapper
@using Snowfall.Application.Dtos.Evenements
@using Snowfall.Application.Dtos.Villes
@using Snowfall.Web.Admin.HttpClients
@inject EvenementHttpClient EvenementHttpClient
@inject VilleHttpClient VilleHttpClient
@inject IMapper Mapper - Mapper
EvenementDto
versModifierEvenementDto
lors de l'initialisationSnowfall.Web.Admin/Pages/Evenements/Edit.razorprotected override async Task OnInitializedAsync()
{
(var status, _evenementDto) = await EvenementHttpClient.ObtenirEvenement(Id);
_villes = await VilleHttpClient.OtenirVilles();
Mapper.Map(_evenementDto, _modifierEvenementDto);
}
Afficher un message de chargement
Pendant le bref moment où _evenementDto
est null et donc qu'on attend une réponse de l'API, on peut afficher un message de chargement.
@page "/evenements/{id:int}/edit"
@using AutoMapper
@using Snowfall.Application.Dtos.Evenements
@using Snowfall.Application.Dtos.Villes
@using Snowfall.Web.Admin.HttpClients
@inject EvenementHttpClient EvenementHttpClient
@inject VilleHttpClient VilleHttpClient
@inject IMapper Mapper
<h1>Modifier l'événement</h1>
@if (_evenementDto == null)
{
<p>Chargement...</p>
}
else
{
}