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
POST
sera 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
_method
qui prend une valeurPATCH
ouDELETE
- 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
middleware
et 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.