web-dev-qa-db-fra.com

Attributs HttpPost vs HttpGet dans MVC: Pourquoi utiliser HttpPost?

Nous avons donc [HttpPost], qui est un attribut facultatif. Je comprends que cela restreint l'appel, il ne peut donc être effectué que par une requête HTTP POST. Ma question est la suivante: pourquoi voudrais-je faire cela?

39
Shane Courtrille

Imaginez ce qui suit:

[HttpGet]
public ActionResult Edit(int id) { ... }

[HttpPost]
public ActionResult Edit(MyEditViewModel myEditViewModel) { ... }

Cela ne serait possible que si le ActionMethodSelectorAttributesHttpGet et HttpPost était utilisé. Cela rend la création d'une vue d'édition très simple. Tous les liens d'action pointent juste vers le contrôleur. Si le modèle de vue est faux, vous revenez simplement à la vue de modification.

Je vais être audacieux et dire que c'est la meilleure pratique en ce qui concerne les choses CRUDish dans ASP.NET MVC.

MODIFIER:

@TheLight a demandé ce qui était nécessaire pour accomplir le poste. C'est simplement un formulaire avec la méthode POST.

En utilisant Razor, cela ressemblerait à quelque chose comme ça.

@using (Html.BeginForm())
{
    <input type="text" placeholder="Enter email" name="email" />
    <input type="submit" value="Sign Up" />
}

Cela rend le code HTML suivant:

<form action="/MyController/Edit" method="post">    
    <input type="text" name="email" placeholder="Enter email">
    <input type="submit" value="Sign Up">
</form>

Lorsque le formulaire est soumis, il effectuera une demande Http Post au contrôleur. L'action avec l'attribut HttpPost gérera la demande.

57
Mikael Östberg

En ce qui concerne les meilleures pratiques pour HttpGet et HttpPost, il est recommandé dans tout développement Web d'utiliser HttpPost pour les créations, les mises à jour et les suppressions (modification des données). Les publications sont bonnes, car elles nécessitent une soumission de formulaire, ce qui empêche les utilisateurs de cliquer sur des liens empoisonnés (par exemple [ https://www.mysite.com/Delete/1] ) dans les e-mails, les sites sociaux, etc. et modifier les données par inadvertance. Si vous êtes simplement en train de lire des données, HttpGet fonctionne très bien.

Voir OWASP pour des considérations de sécurité plus approfondies et pourquoi le jeton de validation augmente la sécurité.

9
Paul Syfrett

C'est pour que vous puissiez avoir plusieurs actions qui utilisent le même nom, vous pouvez utiliser l'attribut HttpPost pour marquer quelle méthode est gérée sur une demande de publication comme ceci:

    public ActionResult ContactUs()
    {
        return View();
    }

    [HttpPost]
    public ActionResult ContactUs(ContactUsModel model)
    {
        //do something with model

        return View();
    }
9
Chris Almond

C'est principalement pour que vous puissiez avoir deux actions avec le même nom, l'une qui est utilisée sur les GET et qui affiche peut-être un formulaire pour l'entrée utilisateur et l'autre qui est utilisée sur les POST lorsque l'utilisateur soumet le formulaire affiché par le GET d'origine. Si les actions ne sont pas différenciées de cette manière, une erreur se produit en raison de l'impossibilité de résoudre quelle action est destinée à gérer la demande.

2
Adam Price