route net mvc httppost httpget examples attribute asp asp.net-mvc attributes http-post http-get

asp.net mvc - net - HttpPost frente a los atributos de HttpGet en MVC: ¿Por qué usar HttpPost?



mvc routing examples (4)

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?


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.


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 porque requieren un envío de formularios, lo que impide que los usuarios hagan clic en enlaces envenenados (por ejemplo [ https://www.mysite.com/Delete/1] ) 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.


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()) { <input type="text" placeholder="Enter email" name="email" /> <input type="submit" value="Sign Up" /> }

Esto representa el siguiente HTML:

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

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