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é
SelectedVilleIdde 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é
SelectedVilleIdduViewModel.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
_Villespour_Filtres - Créer un
ViewModelFiltresViewModelpour cette vue.
Renommer la vue partielle
- Utilisez la fonction
Refactor this...->Renamesur le fichierVilles.cshtml - Renommez-le
_Filtres.cshtml - Modifiez l'appel à la vue partielle dans
Index.cshtmlSnowfall.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
EvenementsIndexViewModelles deux propriétés, pour les remplacer plutôt par leViewModelde 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
ViewModelSnowfall.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
ViewModelSnowfall.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>
}


