Aller au contenu principal

19-4 Action Questions#New

L'action New du contrôleur de questions sera responsable d'afficher le formulaire. Pas la création en tant que telle cepencant puisque cette dernière sera traité par l'action Create plus tard.

Créer l'action New de base

Snowfall.Web.Mvc/Controllers/QuestionsController.cs
[HttpGet("[action]")]
[Authorize]
public IActionResult New(int evenementId)
{
return View();
}
info
  • [HttpGet("[action]")]: est l'équivalent d'écrire [HttpGet("new")]
  • [Authorize]: on s'assure qu'on ne peut accéder au formulaire de création de questions si nous ne sommes pas identifiés
  • public IActionResult New(int evenementId): remarquez que nous pouvons recevoir en entrée le id de l'événement puisqu'il est spécifié comme attribut de route dans la route de base du contrôleur! Pas besoin de le redéfinir dans la route de chaque action, on peut assumer que la route de base fait son travail.

Créer la vue New de base

return View() est en erreur dans l'action puisque la vue n'existe pas.

Sous Views/Questions, créez une vue New (Razor MVC View with Layout).

On peut faire un peu de nettoyage comme ceci:

Snowfall.Web.Mvc/Views/Questions/New.cshtml
@{
ViewBag.Title = "Poser une question";
}

<h2>@ViewBag.Title</h2>

Ajouter un lien à Evenements#Show

On accédera à la création d'une question à partir de la vue Show d'un événement. Modifions la vue pour permettre cette nouvelle action.

Sous le bouton Acheter un billet, on ajoutera un lien pour poser une question aux organisateurs de l'événement. Comme ceci:

http://localhost:4200

Pour ce faire, on peut ajouter à la fin de la vue Evevenements/Show.cshtml:

Snowfall.Web.Mvc/Views/Evenements/Show.cshtml
<!-- ... -->

<form asp-controller="Panier" asp-action="Create">
<input type="hidden" name="itemId" value="@Model.Id" />
<button class="btn btn-primary mt-5">Acheter un billet</button>
</form>

@if (User.Identity?.IsAuthenticated == true)
{
<div class="mt-3">
<a class="mt-5"
asp-controller="Questions"
asp-action="New"
asp-route-evenementId="@Model.Id">Poser une question aux organisteurs</a>
</div>
}
</div>
</div>
info
  • @if (User.Identity?.IsAuthenticated == true): on vérifie que l'utilisateur est connecté. La raison du == true est que cela force la valeur à être convertie en bool. Comme User.Identity? peut retourner null, on peut soit:
    • Ignorer et utiliser User.Identity!.IsAuthenticated, mais cela peut possiblement finir par poser problème dans le cas où la valeur serait null.
    • Utiliser une méthode de conversion du résultat en bool, puis utiliser ? avant d'appeler IsAuthenticated dans le cas où Identity serait null.
  • asp-controller="Questions": on fait un lien vers le contrôleur questions
  • asp-route-evenementId="@Model.Id": la portion evenementId de la route sera le id du ViewModel associé à la vue, soit le id de l'événement
  • asp-action="New": on fait un lien vers l'action New

Vous pouvez cliquer sur le bouton qui devrait vous emmener vers la page pour poser une question.