HttpPost против атрибутов HttpGet в MVC: зачем использовать HttpPost? - PullRequest
37 голосов
/ 17 марта 2011

Итак, у нас есть [HttpPost], который является необязательным атрибутом. Я понимаю, что это ограничивает вызов, поэтому он может быть сделан только с помощью запроса HTTP POST. Мой вопрос: зачем мне это делать?

Ответы [ 4 ]

55 голосов
/ 17 марта 2011

Представьте себе следующее:

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

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

Это было бы невозможно, если бы ActionMethodSelectorAttributes HttpGet и HttpPost там, где они используются.Это действительно упрощает создание представления редактирования.Все ссылки действий просто указывают прямо на контроллер.Если модель представления подтверждает ложь, вы просто возвращаетесь обратно к представлению редактирования снова.

Я буду смелым и скажу, что это лучшая практика, когда дело касается CRUDish вещей в ASP.NET MVC.

РЕДАКТИРОВАТЬ:

@ TheLightспросил, что нужно было для того, чтобы завершить пост.Это просто форма с методом POST.

Используя Razor, это выглядело бы примерно так:

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

Это отображает следующий HTML:

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

КогдаФорма отправлена, она выполнит запрос Http Post к контроллеру.Действие с атрибутом HttpPost будет обрабатывать запрос.

9 голосов
/ 21 марта 2012

Что касается передового опыта для HttpGet и HttpPost, то в любой веб-разработке рекомендуется использовать HttpPost для создания, обновления и удаления (изменение данных).Публикации хороши, потому что они требуют отправки формы, которая не позволяет пользователям нажимать на зараженные ссылки (например, [https://www.mysite.com/Delete/1]) в электронных письмах, социальных сайтах и ​​т. Д. И непреднамеренно менять данные. Если вы просто читаете данные, HttpGet отлично работает).

См. OWASP для более подробных соображений безопасности и почему токен проверки повышает безопасность.

9 голосов
/ 17 марта 2011

Таким образом, вы можете иметь несколько действий, которые используют одно и то же имя, вы можете использовать атрибут HttpPost, чтобы отметить, какой метод обрабатывается в запросе Post, например:

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

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

        return View();
    }
2 голосов
/ 17 марта 2011

Это в основном так, что вы можете иметь два действия с одинаковым именем, один, который используется в GET и, возможно, отображает форму для ввода пользователя, а другой используется в POST, когда пользователь отправляет форму, отображаемую в исходном GET. Если действия не дифференцируются таким образом, произойдет ошибка из-за невозможности определить, какое действие предназначено для обработки запроса.

...