HttpPost vs atributos HttpGet en MVC: ¿Por qué usar HttpPost?


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

Author: Steve Chambers, 2011-03-17

4 answers

Imagine lo siguiente:

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

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

Esto no sería posible a menos que el Métodos de la acción HttpGet y HttpPost donde se utilice. Esto hace que sea muy sencillo crear una vista de edición. Todos los enlaces de acción solo apuntan directamente al controlador. Si el modelo de vista valida false, simplemente vuelve a la vista de edición.

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

EDITAR:

@TheLight preguntó qué se necesitaba en la vista para llevar a cabo el post. Es simplemente un formulario con publicación de método.

Usando Razor, esto se vería algo como esto.

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

Esto renderiza 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 Http Post al controlador. La acción con el atributo HttpPost manejará la solicitud.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-27 10:30:21

En cuanto a las mejores prácticas para HttpGet y HttpPost, es una buena práctica en cualquier desarrollo web usar HttpPost para Crear, Actualizar y Eliminar (modificación de datos). Las publicaciones son buenas, porque requieren un envío de formulario, lo que evita que los usuarios hagan clic en enlaces envenenados (por ejemplo, [ https://www.mysite.com/Delete/1] ) en correos electrónicos, sitios sociales, etc. y cambiando datos inadvertidamente. Si básicamente solo está leyendo datos, HttpGet funciona muy bien.

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

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-20 20:41:16

Para que pueda tener varias acciones que usan el mismo nombre, puede usar el atributo HttpPost para marcar qué método se maneja en una solicitud Post de la siguiente manera:

    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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 21:57:19

Esto es principalmente para que pueda tener dos acciones con el mismo nombre, uno que se usa en GETs y tal vez muestra un formulario para la entrada del usuario y el otro que se usa en los mensajes 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 manejar la solicitud.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 21:53:57