19-9 Support pour PUT/PATCH/DELETE
Un formulaire, selon le standard HTML ne peut effectuer que les types de requête HTTP suivante:
- GET
- POST
Nous avons cependant plusieurs autres verbes HTTP qui témoignent de l'intention de la requête! Par exemple, PATCH pour modifier ou DELETE pour supprimer.
Afin de contourner cette limitation, la majeure partie des cadriciels rendus serveur offrent des solutions. Le principe de base est:
- On ne peut changer le standard HTML et comment les navigateurs fonctionnent. Alors, une requête
POSTsera la majeure partie du temps envoyée par le formulaire. - On peut cependant mettre des champs cachés dans le formulaire et changer le comportement de la requête côté serveur lorsqu'on reçoit cette dernière!
- Par exemple, un champ
input_methodqui prend une valeurPATCHouDELETE - Le serveur, en recevant la requête, change le type de cette dernière avant qu'elle se rende au système de routage et ensuite au contrôleur.
- On appelle ce genre de système un
middlewareet il est exécuté avant le routage
De façon concrète dans un formulaire, cela se matérialisera comme suit:
<form asp-controller="Questionns"
asp-action="Update"
asp-route-id="@Model.Id"
asp-route-evenementId="@Model.EvenementId">
<input type="hidden" name="_method" value="PATCH"/>
Nous n'avons pas eu à gérer ce cas de figure jusqu'à maintenant puisque toutes nos requêtes étaient soient un GET ou un POST.
Afin de continuer à utiliser des formats de route de type REST, en utilisant les verbes HTTP, on peut ajouter une configuration très simple.
Ajout de UseHttpMethodOverride dans Program.cs
Ajoutez la ligne suivante à Program.cs, avant app.UseROuting();.
//...
app.UseHttpsRedirection();
// permets les méthodes PUT/PATCH/DELETE dans les formulaires. À mettre avant UseRouting()!
app.UseHttpMethodOverride(new() { FormFieldName = "_method" });
app.UseRouting();
app.UseSession();
//...
On active le middleware HttpMethodOverride et on précise le nom du input qui peut être utilisé afin de changer le verbe de l'action.
Nous utiliserons _method, mais il s'agit d'une question de préférence.