【发布时间】:2011-03-16 21:50:55
【问题描述】:
所以我们有 [HttpPost],这是一个可选属性。我知道这会限制调用,因此只能通过 HTTP POST 请求进行。我的问题是我为什么要这样做?
【问题讨论】:
标签: asp.net-mvc attributes http-post http-get
所以我们有 [HttpPost],这是一个可选属性。我知道这会限制调用,因此只能通过 HTTP POST 请求进行。我的问题是我为什么要这样做?
【问题讨论】:
标签: asp.net-mvc attributes http-post http-get
想象一下:
[HttpGet]
public ActionResult Edit(int id) { ... }
[HttpPost]
public ActionResult Edit(MyEditViewModel myEditViewModel) { ... }
除非使用了 ActionMethodSelectorAttributes HttpGet
和 HttpPost
,否则这是不可能的。
这使得创建编辑视图变得非常简单。所有的动作链接都直接指向控制器。如果视图模型验证为假,您只需再次弹回编辑视图。
当涉及到 ASP.NET MVC 中的 CRUDish 事物时,我会大胆地说这是最佳实践。
编辑:
@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
属性的操作将处理请求。
【讨论】:
这样您就可以拥有多个使用相同名称的操作,您可以使用 HttpPost 属性来标记在 Post 请求上处理哪个方法,如下所示:
public ActionResult ContactUs()
{
return View();
}
[HttpPost]
public ActionResult ContactUs(ContactUsModel model)
{
//do something with model
return View();
}
【讨论】:
就 HttpGet 和 HttpPost 的最佳实践而言,在任何 Web 开发中使用 HttpPost 进行创建、更新和删除(数据修改)都是很好的实践。 Post 很好,因为它们需要提交表单,这可以防止用户单击电子邮件、社交网站等中的中毒链接(例如 [https://www.example.com/Delete/1])并无意中更改数据。如果您基本上只是在读取数据,HttpGet 效果很好。
请参阅OWASP,了解更深入的安全注意事项以及验证令牌提高安全性的原因。
【讨论】:
这主要是为了让你可以有两个同名的Action, 一个用于 GET 并可能显示用户输入的表单,另一个在用户提交原始 GET 显示的表单时用于 POST。如果没有这样区分Action,就会因为无法解析出哪个Action来处理请求而产生错误。
【讨论】: