29-3 Création (Select ville)
À l'étape précédente, la base du formulaire de création d'événements a été mise en place via les champs input
.
Cependant, aucune option n'est présente dans la boite de sélection de ville. Il faut en effet remplir cette liste à partir d'un appel à l'API.
Pour faire cet appel, un contrôleur d'API de villes sera nécessaire. Heureusement, le service et le repository permettant de récupérer ces valeurs à partir de la BD existent déjà, donc le travail sera assez limité.
Créer le contrôleur d'API VillesController
- Sous
Snowfall.Web.Api/Controllers
->Add
->Scaffolded Item
- Sélectionner
API Controller - Empty
- Nommer le contrôleur
VillesController
Snowfall.Web.Api/Controllers/VillesController.csnamespace Snowfall.Web.Api.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class VillesController : ControllerBase
{
}
}
Créer l'action VillesController#Index
Pour retourner la liste de villes, une action Index
répondant à la méthode HTTP
GET
peut être créée.
Cette action n'aura rien de très particulier outre qu'on récupère la liste de villes via le service et qu'on effectue le mappage en DTO
.
De plus, remarquez qu'on injecte via injection de dépendances IVilleService
et IMapper
.
namespace Snowfall.Web.Api.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class VillesController : ControllerBase
{
private readonly IVilleService _villeService;
private readonly IMapper _mapper;
public VillesController(
IVilleService villeService,
IMapper mapper)
{
_villeService = villeService;
_mapper = mapper;
}
// GET /api/villes
[HttpGet]
public async Task<IActionResult> Index()
{
List<Ville> villes = await _villeService.GetAll();
List<VilleDto> villesDto = _mapper.Map<List<VilleDto>>(villes);
return Ok(villesDto);
}
}
}
Tester l'API
Utilisez Postman ou Scalar pour faire une requête d'API avec api/villes
. Vous devriez recevoir la liste de villes en format JSON.
Récupérer les options de la boîte de sélection via l'API
Maintenant qu'un point de terminaison d'API retourne la liste des villes disponibles dans le système, nous devrions pouvoir l'utiliser pour la boîte de sélection de villes.
Ajouter une variable List<VilleDto>
à la page New
Afin de contenir la liste de villes, on créera une variable List<VilleDto>? villes
au niveau du composant de page
<!-- ... -->
@code {
private CreerEvenementDto _creerEvenementDto = new();
private List<VilleDto>? villes;
async Task GererSubmit()
{
Console.WriteLine("Le formulaire a bien été soumis");
}
}
On assignera des valeurs à cette liste lors de l'initialisation de la composante à l'étape suivante.
Ajout de OnInitializedAsync
Ajoutez la coquille de la fonction OnInitializedAsync
qui est appelée lors de l'initialisation de la composante. Lors de l'initialisation, on voudra récupérer la liste de villes.
@code {
private CreerEvenementDto _creerEvenementDto = new();
private List<VilleDto>? villes;
protected override async Task OnInitializedAsync()
{
// Obtenir la liste de villes...
}
async Task GererSubmit()
{
Console.WriteLine("Le formulaire a bien été soumis");
}
}
Créer VillesClient pour communiquer avec l'API
Avant d'aller plus loin, il nous faut une classe HttpClient
pour communiquer avec la portion villes
de l'API.
En effet, tout comme on utilise EvenementHttpClient
pour communiquer avec l'API dans le cadre d'un événement, on créera VilleHttpClient
afin de communiquer avec la portion villes
de l'API.
-
Sous
Web.Admin/HttpClients
->Add
->Class/Interface
-
Nommer la classe
VilleHttpClient
-
Oups, ne reste des notes de cours pour cette section a été détruite lors d'un malencontreux incident!
Vous devez compléter la classe par vous-même et créer une fonction
ObtenirVilles
qui retourne la liste des villes.
Utiliser le client HTTP dans le composant New
Il ne reste qu'à utiliser le client et le retour pour les options de la boîte de sélection!
-
Injecter
VilleHttpClient
dansNew
Snowfall.Web.Admin/Pages/Evenements/New.razor@page "/evenements/new"
@using Microsoft.Extensions.Localization
@using Snowfall.Application.Dtos.Evenements
@using Snowfall.Application.Dtos.Villes
@using Snowfall.Web.Admin.HttpClients
@using Snowfall.Web.Admin.Resources
@inject IStringLocalizer<Resources.Evenements.New> Localizer;
@inject IStringLocalizer<SharedResources> LocalizerShared;
@inject VilleHttpClient VilleHttpClient;
<!-- ... --> -
Charger la liste de villes lors de l'initialisation du composant
Snowfall.Web.Admin/Pages/Evenements/New.razor<!-- ... -->
@code {
private CreerEvenementDto _creerEvenementDto = new();
private List<VilleDto>? villes;
protected override async Task OnInitializedAsync()
{
villes = await VilleHttpClient.OtenirVilles();
}
async Task GererSubmit()
{
Console.WriteLine("Le formulaire a bien été soumis");
}
} -
Populer la liste d'options à partir de la variable
villes
, si elle n'est pasnull
Snowfall.Web.Admin/Pages/Evenements/New.razor<!-- ... -->
<div class="form-floating mb-3">
<InputSelect id="ville" class="form-select" @bind-Value="evenementDto.VilleId">
<option value="">Veuillez faire une sélection</option>
@if (@villes != null)
{
@foreach (var ville in villes)
{
<option value="@ville.Id">@ville.Nom, @ville.PaysIso</option>
}
}
</InputSelect>
<label for="ville">@LocalizerEvenementDto["Ville"]</label>
</div>
<!-- ... -->
Test
Vous pouvez tester et devriez obtenir une liste de villes dans la boîte de sélection!
