19-6 Gestion des id erronés ou inexistants
Le formulaire d'ajout de question fonctionne comme attendu, mais il y a un problème possible dans le cas où le id de l'événement récupéré n'est pas celui d'un événement valide.
En effet, rien n'empêche d'accéder à une URL du genre /evenements/55555555/Questions/New
, soit avec un evenementId
non valide. Le formulaire est affiché, ce qui est étrange, et évidemment, dans ce cas, la sauvegarde génèrera une erreur.
Pour régler ce problème, on doit premièrement essayer de récupérer l'événement via une requête de BD et si l'événement est null
, retourner une erreur 404.
Injection de EvenementService
dans QuestionsController
Pour vérifier si l'identifiant de l'événement reçu via l'URL est valide, on devra récupérer l'événement associé. Pour cela, on aura besoin du service d'événements.
// ...
[Route("evenements/{evenementId:int}/[controller]")]
public class QuestionsController : Controller
{
private readonly IQuestionService _questionService;
private readonly IEvenementService _evenementService;
public QuestionsController(
IQuestionService questionService,
IEvenementService evenementService)
{
_questionService = questionService;
_evenementService = evenementService;
}
//...
Retourner NotFound
si l'événement est inexistant
- Dans
New
, modifiez l'action pour une fonctionasync
, récupérez l'événement et retournezNotFound()
si ce dernier estnull
Snowfall.Web.Mvc/Controllers/QuestionsController.cspublic async Task<IActionResult> New(int evenementId)
{
var evenement = await _evenementService.FindById(evenementId);
if (evenement == null) return NotFound();
var viewModel = new CreerQuestionViewModel()
{
EvenementId = evenementId
};
return View(viewModel);
} - Idem pour
Create
, on doit vérifier que l'événement existe avant de créer la question.Snowfall.Web.Mvc/Controllers/QuestionsController.cspublic async Task<IActionResult> Create(int evenementId, CreerQuestionViewModel questionViewModel)
{
var evenement = await _evenementService.FindById(evenementId);
if (evenement == null) return NotFound();
if (!ModelState.IsValid)
{
return View("New", questionViewModel);
}
//...
var evenement
est utilisé plutôt que Evenement evenement
puisque le retour du service pouvant être null, il ne s'agit pas nécessairement d'un Evenement
comme type de retour.