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ć?
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.
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.
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.
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();
}
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.
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