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.
[HttpGet("{id:int}")]
public IActionResult Show(int id, string? option)
{
string sql = @"
SELECT * from evenements
WHERE id = @Id;
";
return View();
}
@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
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,@Iddans la requête paramétrée corresponds à la propriétéIdde l'objet anonymeparam. On assigne la variableiden provenance de la route à cette propriétéId.QuerySingleOrDefault: plutôt que simplementQuery, cette fonction Dapper permet de retourner un seul élément (LIMIT 1) ounulldans le cas où il n'y a aucun résultat.<Evenement>: le retour de la BD seramappévers un objet de typeEvenement.(sql, param): on ajoute l'objet de paramètres à la requête ce qui a pour effet de remplacer la mention@Iddans la requête par la valeur de la variableiden provenance de la route.Evenement?indique que le retour peut être null. Dans le cas où unidne serait pas associé à un événement,nullserait 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.


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.
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);
}
}
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! 🙂
