Aller au contenu principal

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 valeur PATCH ou DELETE
  • 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();.

Snowfall.Web.Mvc/Program.cs
//...

app.UseHttpsRedirection();
// permets les méthodes PUT/PATCH/DELETE dans les formulaires. À mettre avant UseRouting()!
app.UseHttpMethodOverride(new() { FormFieldName = "_method" });
app.UseRouting();
app.UseSession();

//...
info

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.