Подтвердить что ты не робот

Атрибуты HttpPost и HttpGet в MVC: зачем использовать HttpPost?

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

4b9b3361

Ответ 1

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

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

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

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

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

EDIT:

@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 будет обрабатывать запрос.

Ответ 2

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

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

Ответ 3

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

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

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

        return View();
    }

Ответ 4

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