Итак, у нас есть [HttpPost], который является необязательным атрибутом. Я понимаю, что это ограничивает вызов, поэтому его можно сделать только по запросу HTTP POST. Мой вопрос: зачем мне это делать?
Атрибуты HttpPost и HttpGet в MVC: зачем использовать HttpPost?
Ответ 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. Если действия не различаются таким образом, возникает ошибка из-за невозможности решить, какое действие предназначено для обработки запроса.