Aller au contenu principal

2-8 Communiquer une liste à la vue

À l'étape précédente, un modèle était envoyé directement à la vue. Ainsi, la vue Index ne contient qu'un seul élément et c'est ce dernier qui est passé à la vue pour être affiché.

Une action Index retourne cependant généralement plusieurs éléments. Alors, comment envoie-t-on une liste?

Définir une liste

Pour retourner une liste, il nous faut premièrement la définir! Il est possible en C# de définir une liste, d'un certain type, de la façon suivante:

Snowfall.Web.Mvc/Controllers/EvenementsController.cs
public IActionResult Index()
{
List<Evenement> evenements = new List<Evenement>()
//...

Ici, une variable evenements, de type List<Evenement> est créée. Le type de la variable est List, et on précise via < > le type d'objet ou de données que contiendra la liste.

Elle est ensuite initialisée via new List<Evenement>() qui crée une liste vide.

Initialiser la liste avec des éléments

On peut initialiser la liste avec des valeurs par défaut de la façon suivante:

Snowfall.Web.Mvc/Controllers/EvenementsController.cs
List<Evenement> evenements = new List<Evenement>()
{
new Evenement()
{
Nom = "Super Duper Évènement LoL",
Description = "Compétition de League of Legends.",
Capacite = 1400, // 1400 personnes
Date = DateTime.Now + TimeSpan.FromDays(30), // dans 30 jours
Prix = new decimal(49.00), // 49$ l'inscription, en decimal
Ville = "Montreal, CA",
},
new Evenement()
{
Nom = "Super Duper Évènement Space Quest 6 Roger Wilco",
Description = "À quoi ressemblerait une compétition de Space Quest 6 est un mystère.",
Capacite = 50, // 50 personnes
Date = DateTime.Now + TimeSpan.FromDays(60), // dans 60 jours
Prix = new decimal(29.00), // 29$ l'inscription, en decimal
Ville = "Los Angeles, US",
},
};

Si nous avions déjà des objets de type Evenement prédéfini, l'initialisation pourrait se faire de la façon suivante:

List<Evenement> evenements = new List<Evenement>()
{
evenement1,
evenement2,
};

Ceci dit, ce n'est pas notre cas pour le moment, donc modifions le contrôleur evenements pour qu'il ressemble à ceci:

Snowfall.Web.Mvc/Controllers/EvenementsController.cs
public IActionResult Index()
{
List<Evenement> evenements = new List<Evenement>()
{
new Evenement()
{
Nom = "Super Duper Évènement LoL",
Description = "Compétition de League of Legends.",
Capacite = 1400, // 1400 personnes
Date = DateTime.Now + TimeSpan.FromDays(30), // dans 30 jours
Prix = new decimal(49.00), // 49$ l'inscription, en decimal
Ville = "Montreal, CA",
},
new Evenement()
{
Nom = "Super Duper Évènement Space Quest 6 Roger Wilco",
Description = "À quoi ressemblerait une compétition de Space Quest 6 est un mystère.",
Capacite = 50, // 1400 personnes
Date = DateTime.Now + TimeSpan.FromDays(60), // dans 60 jours
Prix = new decimal(29.00), // 29$ l'inscription, en decimal
Ville = "Los Angeles, US",
},
};

return View(evenements);
}
important

Remarquez que nous retournons View(evenements) maintenant, donc la liste est envoyée à la vue.

Modifier la vue

Le contrôleur nous indique une erreur avec la variable evenements envoyée. En effet, evenements devrait être surligné en rouge, avec l'erreur suivante:

Argument type 'System.Collections.Generic.List<Snowfall.Web.Mvc.Models.Evenement>' is not assignable to model type 'Snowfall.Web.Mvc.Models.Evenement'

Pourquoi?

Eh bien, la vue Index s'attend à recevoir comme modèle un objet de type Evenement.

Snowfall.Web.Mvc/Views/Evenements/Index.cshtml
@model Evenement;

Remplacez la première ligne par le bon type, soit une liste d'événements:

Snowfall.Web.Mvc/Views/Evenements/Index.cshtml
@model List<Evenement>;

Mais maintenant... tout est en rouge!

Imgur

Voyons dans la prochaine section comment afficher la liste via la syntaxe Razor pour les vues.