HttpPost frente a los atributos de HttpGet en MVC: ¿Por qué usar HttpPost?

Entonces tenemos [HttpPost], que es un atributo opcional. Entiendo que esto restringe la llamada, por lo que solo se puede realizar mediante una solicitud HTTP POST. Mi pregunta es por qué querría hacer esto?

Imagina lo siguiente:

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

Esto no sería posible a menos que se use HttpGet y HttpPost . Esto hace que sea realmente simple crear una vista de edición. Todos los enlaces de acción solo apuntan directamente al controlador. Si el modelo de vista valida falso, simplemente vuelve a aparecer en la vista de edición nuevamente.

Seré audaz y diré que esta es la mejor práctica cuando se trata de cosas CRUDISH en ASP.NET MVC.

EDITAR:

@TheLight preguntó qué se necesitaba en la vista para lograr la publicación. Es simplemente una forma con método POST.

Usando Razor, esto se vería más o menos así.

 @using (Html.BeginForm()) {   } 

Esto representa el siguiente HTML:

 

Cuando se envía el formulario, realizará una solicitud de Http Post al controlador. La acción con el atributo HttpPost manejará la solicitud.

En cuanto a las mejores prácticas para HttpGet y HttpPost, es una buena práctica en cualquier desarrollo web utilizar HttpPost para crear, actualizar y eliminar (modificación de datos). Las publicaciones son buenas, ya que requieren un envío de formularios, lo que evita que los usuarios hagan clic en enlaces envenenados (por ejemplo [ https://www.mysite.com/Delete/1%5D ) en correos electrónicos, sitios sociales, etc. y cambien datos inadvertidamente. Si básicamente solo lees datos, HttpGet funciona muy bien.

Vea OWASP para más consideraciones de seguridad en profundidad y por qué el token de validación aumenta la seguridad.

Es así que puede tener varias acciones que usan el mismo nombre, puede usar el atributo HttpPost para marcar qué método se maneja en una solicitud de publicación como sigue:

  public ActionResult ContactUs() { return View(); } [HttpPost] public ActionResult ContactUs(ContactUsModel model) { //do something with model return View(); } 

Esto se debe principalmente a que puede tener dos Acciones con el mismo nombre, una que se usa en GET y quizás muestra un formulario para la entrada de usuario y la otra se usa en POST cuando el usuario envía el formulario mostrado por el GET original. Si las Acciones no se diferencian de esta manera, se producirá un error debido a que no se puede resolver qué Acción está destinada a gestionar la solicitud.