12-6 Filtre actif
Bien que le filtre fonctionne, aucune indication n'est présente quant à l'élément actif.
Pour ce faire, on peut utiliser une propriété du ViewModel
afin de stocker le filtre actif
- Ajouter une propriété
SelectedVilleId
de typeint
àEvenementsIndexViewModel
.Snowfall.Web.Mvc/Models/Evenements/EvenementsIndexViewModel.cspublic class EvenementsIndexViewModel
{
public required List<Evenement> Evenements { get; set; }
public required List<Ville> Villes { get; set; }
public int? SelectedVilleId { get; set; }
} - Assigner la valeur en provenance du contrôleur à la propriété
SelectedVilleId
duViewModel
.Snowfall.Web.Mvc/Controllers/EvenementsController.cs//...
var viewModel = new EvenementsIndexViewModel
{
Villes = villes,
Evenements = evenements,
SelectedVilleId = ville
};
//...
Mais maintenant, comment passer cette sélection à la vue partielle _Villes
?
En effet, si vous regardez, votre vue partielle _Villes
reçoit en entrée une liste de villes:
@model List<Ville>
Mais nous avons besoin d'une liste de villes, en plus de la ville sélectionnée!
Convertir en vue Filtres
et FiltresEvenementsViewModel
Il devient clair que l'approche actuelle ne tient plus la route avec nos nouvelles contraintes. De plus, si vous ajoutez des filtres, cela ne deviendra que de plus en plus complexe.
Nous allons donc:
- Renommer la vue partielle
_Villes
pour_Filtres
- Créer un
ViewModel
FiltresViewModel
pour cette vue.
Renommer la vue partielle
- Utilisez la fonction
Refactor this...
->Rename
sur le fichierVilles.cshtml
- Renommez-le
_Filtres.cshtml
- Modifiez l'appel à la vue partielle dans
Index.cshtml
Snowfall.Web.Mvc/Views/Evenements/Index.cshtml@model EvenementsIndexViewModel
@{
ViewBag.Title = "Événements";
}
<h1>Événements</h1>
<div class="row">
<div class="col-lg-3 mb-4">
<partial name="_Filtres" model="Model.Villes" />
</div>
//...
Créer un FiltresEvenementsViewModel
- Sous le dossier Models/Evenements du projet MVC, créez une nouvelle classe
FiltresEvenementsViewModel
. - Ajoutez-y la liste de villes et la ville active
Snowfall.Web.Mvc/Models/Evenements/FiltresEvenementsViewModel.cs
public class FiltresEvenementsViewModel
{
public required List<Ville> Villes { get; set; }
public int? SelectedVilleId { get; set; }
} - Vous pouvez retirer de
EvenementsIndexViewModel
les deux propriétés, pour les remplacer plutôt par leViewModel
de filtres.Snowfall.Web.Mvc/Models/Evenements/EvenementsIndexViewModel.cspublic class EvenementsIndexViewModel
{
public required List<Evenement> Evenements { get; set; }
public required FiltresEvenementsViewModel FiltresEvenements { get; set; }
} - Dans le contrôleur
Evenements
, remplacez les deux propriétés précédentes par un nouvel objetFiltresEvenementsViewModel
.Snowfall.Web.Mvc/Controllers/EvenementsController.csvar viewModel = new EvenementsIndexViewModel
{
Evenements = evenements,
FiltresEvenements = new FiltresEvenementsViewModel()
{
Villes = villes,
SelectedVilleId = ville
}
}; - À partir de l'index, envoyez à la vue partielle le nouveau
ViewModel
Snowfall.Web.Mvc/Views/Evenements/Index.cshtml@model EvenementsIndexViewModel
@{
ViewBag.Title = "Événements";
}
<h1>Événements</h1>
<div class="row">
<div class="col-lg-3 mb-4">
<partial name="_Filtres" model="Model.FiltresEvenements" />
</div> - Modifier la vue partielle pour utiliser le
ViewModel
Snowfall.Web.Mvc/Views/Evenements/_Filtres.cshtml@model FiltresEvenementsViewModel
<form method="get" asp-controller="Evenements" asp-action="Index">
<h6 class="text-uppercase">Filtrer par ville</h6>
<ul class="list-group">
@foreach (Ville ville in Model.Villes)
{
Fiou, c'est fait! 😅
Sélectionner la ville active
La dernière étape consiste à sélectionner la ville active. Pour ce faire, on peut utiliser une condition sur l'attribut checked
si la ville sélectionnée correspond au Id
de la ville dans la boucle.
@foreach (Ville ville in Model.Villes)
{
<li class="list-group-item list-group-item-action">
<input class="form-check-input me-1" type="radio" name="ville" value="@ville.Id" id="ville_@ville.Id" checked="@(Model.SelectedVilleId == ville.Id ? "checked" : null)"/>
<label class="form-check-label" for="ville_@ville.Id">@ville.Nom, @ville.PaysIso</label>
</li>
}
