HttpPost vs HttpGet atrybuty w MVC: Dlaczego używać HttpPost?

Mamy więc [HttpPost], który jest atrybutem opcjonalnym. Rozumiem, że to ogranicza wywołanie, więc może być wykonane tylko przez żądanie HTTP POST. Moje pytanie brzmi: dlaczego miałbym to zrobić?

Author: Steve Chambers, 2011-03-17

4 answers

Wyobraź sobie, co następuje:

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

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

Nie byłoby to możliwe, gdyby nie ActionMethodSelectorAttributes HttpGet i HttpPost Gdzie są używane. To sprawia, że Tworzenie widoku edycji jest naprawdę proste. Wszystkie linki akcji po prostu wskazują z powrotem na kontroler. Jeśli model widoku potwierdzi wartość false, po prostu ponownie przejdziesz do widoku edycji.

Będę odważny i powiem, że jest to najlepsza praktyka, jeśli chodzi o brutalne rzeczy w ASP.NET MVC.

EDIT:

@ thelight zapytał, co jest potrzebne do wykonania posta. To po prostu formularz z method POST.

Używając brzytwy, wyglądałoby to mniej więcej tak.

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

To renderuje następujący kod HTML:

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

Gdy formularz zostanie przesłany, wykona on żądanie Http Post do kontrolera. Akcja z atrybutem HttpPost obsłuży żądanie.

 54
Author: Mikael Östberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 10:30:21

Jeśli chodzi o najlepsze praktyki dla HttpGet i HttpPost, dobrą praktyką w każdym tworzeniu stron internetowych jest używanie HttpPost do tworzenia, aktualizowania i usuwania (modyfikacja danych). Posty są dobre, ponieważ wymagają przesłania formularza, co uniemożliwia użytkownikom klikanie w linki (np. [ https://www.mysite.com/Delete/1] ) w e-mailach, serwisach społecznościowych itp. i zmiana danych nieumyślnie. Jeśli po prostu czytasz dane, HttpGet działa świetnie.

Zobacz OWASP Po Więcej szczegółowe względy bezpieczeństwa i dlaczego token walidacji zwiększa bezpieczeństwo.

 9
Author: Paul Syfrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-20 20:41:16

Its więc możesz mieć wiele akcji, które używają tej samej nazwy, możesz użyć atrybutu HttpPost, aby zaznaczyć, która metoda jest obsługiwana w żądaniu Post jak tak:

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

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

        return View();
    }
 8
Author: Chris Almond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 21:57:19

Jest to głównie po to, aby można było mieć dwie akcje o tej samej nazwie, jeden, który jest używany w Get i być może wyświetla formularz dla wpisu użytkownika, a drugi jest używany w postach, gdy użytkownik przesyła formularz wyświetlany przez oryginalny GET. Jeśli działania nie są zróżnicowane w ten sposób, wystąpi błąd z powodu niemożności rozwiązania, które działanie ma obsłużyć żądanie.

 2
Author: Adam Price,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 21:53:57