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,@Id
dans la requête paramétrée corresponds à la propriétéId
de l'objet anonymeparam
. On assigne la variableid
en 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
) ounull
dans 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@Id
dans la requête par la valeur de la variableid
en provenance de la route.Evenement?
indique que le retour peut être null. Dans le cas où unid
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.

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! 🙂