wake-up-neo.com

HttpPost vs HttpGet-Attribute in MVC: Warum HttpPost verwenden?

Wir haben also [HttpPost], ein optionales Attribut. Ich verstehe, dass dies den Anruf einschränkt, sodass er nur über eine HTTP POST Anfrage erfolgen kann. Meine Frage ist, warum ich das tun möchte.

39

Stellen Sie sich Folgendes vor:

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

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

Dies wäre nur möglich, wenn die ActionMethodSelectorAttributesHttpGet und HttpPost verwendet werden. Dies macht es wirklich einfach, eine Bearbeitungsansicht zu erstellen. Alle Aktionslinks zeigen direkt zurück zum Controller. Wenn das Ansichtsmodell false bestätigt, kehren Sie einfach wieder zur Bearbeitungsansicht zurück.

Ich werde mutig sein und sagen, dass dies die beste Vorgehensweise ist, wenn es um CRUDish-Dinge in ASP.NET MVC geht.

EDIT:

@TheLight fragte, was in der Ansicht benötigt wurde, um den Beitrag zu erledigen. Es ist einfach nur ein Formular mit der Methode POST.

Mit Razor würde dies ungefähr so ​​aussehen.

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

Dadurch wird der folgende HTML-Code gerendert:

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

Wenn das Formular gesendet wird, führt es eine HTTP-Post-Anforderung an den Controller aus. Die Aktion mit dem Attribut HttpPost verarbeitet die Anforderung.

57
Mikael Östberg

Was die Best Practices für HttpGet und HttpPost anbelangt, ist es in jeder Webentwicklung empfehlenswert, HttpPost für das Erstellen, Aktualisieren und Löschen von Daten zu verwenden (Datenänderung). Beiträge sind gut, da sie eine Formularübertragung erfordern, die verhindert, dass Benutzer in E - Mails, sozialen Netzwerken usw. Auf vergiftete Links (z. B. [ https://www.mysite.com/Delete/1] ) klicken und versehentlich Daten ändern. Wenn Sie im Grunde nur Daten lesen, funktioniert HttpGet großartig.

In OWASP finden Sie ausführlichere Überlegungen zur Sicherheit und warum das Validierungstoken die Sicherheit erhöht.

9
Paul Syfrett

Damit Sie mehrere Aktionen mit demselben Namen haben können, können Sie mit dem HttpPost-Attribut festlegen, welche Methode bei einer Post-Anfrage wie folgt behandelt wird:

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

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

        return View();
    }
9
Chris Almond

Dies dient hauptsächlich dazu, dass Sie zwei Aktionen mit demselben Namen ausführen können. Eine wird in GETs verwendet und zeigt möglicherweise ein Formular für die Benutzereingabe an. Die andere wird in POSTs verwendet, wenn der Benutzer das vom ursprünglichen GET angezeigte Formular sendet. Wenn die Aktionen nicht auf diese Weise unterschieden werden, tritt ein Fehler auf, da nicht geklärt werden kann, welche Aktion die Anforderung verarbeiten soll.

2
Adam Price