所以我们有[HttpPost],它是一个可选属性。我理解这会限制调用方式,只能通过HTTP POST请求进行。我的问题是为什么要这样做?
所以我们有[HttpPost],它是一个可选属性。我理解这会限制调用方式,只能通过HTTP POST请求进行。我的问题是为什么要这样做?
想象以下情况:
[HttpGet]
public ActionResult Edit(int id) { ... }
[HttpPost]
public ActionResult Edit(MyEditViewModel myEditViewModel) { ... }
这不可能实现,除非使用了 ActionMethodSelectorAttributes 的 HttpGet
和 HttpPost
。@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
属性的操作将处理该请求。在HttpGet和HttpPost方面的最佳实践中,对于创建、更新和删除(数据修改)在任何Web开发中使用HttpPost是一个好习惯。Post是最好的,因为它们需要表单提交,这可以防止用户在电子邮件、社交网站等中点击毒瘤链接(例如[https://www.example.com/Delete/1]),无意中更改数据。如果您基本上只读取数据,则HttpGet非常适合。
有关更深入的安全考虑和验证令牌如何增加安全性,请参见OWASP。
这样做可以让您拥有多个使用相同名称的操作,您可以使用HttpPost属性标记哪个方法在Post请求上处理,如下所示:
public ActionResult ContactUs()
{
return View();
}
[HttpPost]
public ActionResult ContactUs(ContactUsModel model)
{
//do something with model
return View();
}
这样做主要是为了让您可以拥有两个同名的操作,一个用于GET请求,可能显示用户输入表单,另一个用于POST请求,当用户提交原始GET显示的表单时使用。如果这些操作没有以这种方式区分,则由于无法解析哪个操作意图处理请求,将会出现错误。