Aller au contenu principal

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.

Imgur

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.

Snowfall.Web.Mvc/Controllers/QuestionsController.cs
// ...

[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

  1. Dans New, modifiez l'action pour une fonction async, récupérez l'événement et retournez NotFound() si ce dernier est null
    Snowfall.Web.Mvc/Controllers/QuestionsController.cs
    public 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);
    }
  2. Idem pour Create, on doit vérifier que l'événement existe avant de créer la question.
    Snowfall.Web.Mvc/Controllers/QuestionsController.cs
    public 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);
    }

    //...
info

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.