Aller au contenu principal

7-5 Obtenir un événement

Pour l'action Show, qui est liée à un identifiant d'événement (id), on doit récupérer l'événement correspondant au id.

Écrire la requête

Dans la fonction Show() du contrôleur, commençons par la requête SQL. Elle est encore relativement simple, mais elle contiendra un élément particulier.

Snowfall.Web.Mvc/Controllers/EvenementsController.cs
[HttpGet("{id:int}")]
public IActionResult Show(int id, string? option)
{
string sql = @"
SELECT * from evenements
WHERE id = @Id;
";

return View();
}
Qu'est-ce que @Id?

La requête SQL doit être dynamique puisque le id recherché changera en fonction de celui demandé.

Les requêtes SQL Dapper sont en quelque sorte des gabarits. On peut y inséder des attributs qui seront remplacés par des valeurs au moment de l'exécution. On appel ces requêtes des requêtes paramétrées.

@Id ne sera pas réellement envoyé à Postgres, Dapper s'occupera de le remplacer par une valeur que nous lui fournirons.

Exécuter la requête

Snowfall.Web.Mvc/Controllers/EvenementsController.cs
public IActionResult Show(int id, string? option)
{
string sql = @"
SELECT * from evenements
WHERE id = @Id;
";

using (IDbConnection connection = new NpgsqlConnection(_connectionString))
{
var param = new
{
Id = id
};
Evenement? evenement = connection.QuerySingleOrDefault<Evenement>(sql, param);

return View(evenement);
}
}

L'essentiel reste identique à la requête de l'action Index. Cependant, on remarque quelques changements:

  • var param: une partie de la magie opère ici. C'est un objet de paramètres. Les propriétés de cet objet doivent correspondre aux paramètres présents dans la SQL. Par exemple, @Id dans la requête paramétrée corresponds à la propriété Id de l'objet anonyme param. On assigne la variable id en provenance de la route à cette propriété Id.
  • QuerySingleOrDefault: plutôt que simplement Query, cette fonction Dapper permet de retourner un seul élément (LIMIT 1) ou null dans le cas où il n'y a aucun résultat.
  • <Evenement>: le retour de la BD sera mappé vers un objet de type Evenement.
  • (sql, param): on ajoute l'objet de paramètres à la requête ce qui a pour effet de remplacer la mention @Id dans la requête par la valeur de la variable id en provenance de la route.
  • Evenement? indique que le retour peut être null. Dans le cas où un id ne serait pas associé à un événement, null serait retourné dans ce cas.

Lancer l'application

Lancer l'application et vous diriger vers /evenements/1 ou en cliquant sur le bouton Details d'un événement devrait vous permettre de voir le détail d'un événement.

http://localhost:4200

party-cat

Gestion du 404 (non trouvé)

Dans le cas où on essaie d'accéder à un id qui n'existe pas, par exemple /evenements/345, vous obtiendrez une erreur:

An unhandled exception occurred while processing the request.
NullReferenceException: Object reference not set to an instance of an object.

Comme la requête SQL ne retourne aucun résultat, un objet null est passé à la vue, générant une erreur lorsqu'on tente d'accéder à ses propriétés.

Il est possible de prévenir cette erreur en retournant plutôt une erreur 404 dans le cas où il n'y a pas d'événement correspondant à l'id.

Snowfall.Web.Mvc/Controllers/EvenementsController.cs
public IActionResult Show(int id, string? option)
{
string sql = @"
SELECT * from evenements
WHERE id = @Id;
";

using (IDbConnection connection = new NpgsqlConnection(_connectionString))
{
var param = new
{
Id = id
};
Evenement? evenement = connection.QuerySingleOrDefault<Evenement>(sql, param);

if (evenement == null)
return NotFound();

return View(evenement);
}
}
info

Dans le cas ou evenement serait null (aucun résultat), on retourne une erreur 404 via la fonction NotFound().

La page est celle par défaut du navigateur, mais pour l'instant nous allons nous satisfaire de cela! 🙂

level up