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
[HttpGet("[action]")]
[Authorize]
public IActionResult New(int evenementId)
{
return View();
}
[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éspublic 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:
@{
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:

Pour ce faire, on peut ajouter à la fin de la vue Evevenements/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>
@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 enbool
. CommeUser.Identity?
peut retournernull
, 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'appelerIsAuthenticated
dans le cas oùIdentity
seraitnull
.
- Ignorer et utiliser
asp-controller="Questions"
: on fait un lien vers le contrôleur questionsasp-route-evenementId="@Model.Id"
: la portionevenementId
de la route sera leid
duViewModel
associé à la vue, soit le id de l'événementasp-action="New"
: on fait un lien vers l'actionNew
Vous pouvez cliquer sur le bouton qui devrait vous emmener vers la page pour poser une question.