HttpPost与HttpGet在MVC中的属性:为什么要使用HttpPost?

47

所以我们有[HttpPost],它是一个可选属性。我理解这会限制调用方式,只能通过HTTP POST请求进行。我的问题是为什么要这样做?

4个回答

63

想象以下情况:

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

[HttpPost]
public ActionResult Edit(MyEditViewModel myEditViewModel) { ... }
这不可能实现,除非使用了 ActionMethodSelectorAttributesHttpGetHttpPost
这使得创建编辑视图变得非常简单。所有的操作链接都直接指向控制器。如果视图模型验证失败,你只需立即返回编辑视图。
我要大胆地说,在 ASP.NET MVC 中处理 CRUDish 事务时,这是最佳实践。
编辑:
@TheLight 问在视图中实现 POST 请求所需要的内容是什么。它只需要一个方法为 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 属性的操作将处理该请求。

1
嗨,Mikael,我喜欢你的回答,但我看到一个小修正。HttpGet和HttpPost不是ActionFilters,而是ActionSelectors。正如名称所示,ActionSelectors与ActionFilters不同。如果您查看源代码中的HttpGet和HttpPost,它们都派生自ActionMethodSelectorAttribute,该属性直接派生自Attribute。您能否将单词ActionFilters替换为ActionSelectors? - VJAI
在视图上应该写什么来提交到这个操作? - The Light

10

在HttpGet和HttpPost方面的最佳实践中,对于创建、更新和删除(数据修改)在任何Web开发中使用HttpPost是一个好习惯。Post是最好的,因为它们需要表单提交,这可以防止用户在电子邮件、社交网站等中点击毒瘤链接(例如[https://www.example.com/Delete/1]),无意中更改数据。如果您基本上只读取数据,则HttpGet非常适合。

有关更深入的安全考虑和验证令牌如何增加安全性,请参见OWASP


10

这样做可以让您拥有多个使用相同名称的操作,您可以使用HttpPost属性标记哪个方法在Post请求上处理,如下所示:

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

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

        return View();
    }

3
也许最好注明一下,POST请求有可能改变数据库的状态或以某种方式修改网站的内部数据。这就是为什么网络爬虫从不跟随这样的URL的原因。 - vbocan
1
我认为现今的网络爬虫并不关心修改数据库或修改内部数据。如果网络爬虫能够成功地通过POST请求处理程序找到它们的路径,那是不够的。 - Ε Г И І И О
在服务器端进行验证是我的建议。爬虫不主动跟随POST请求的原因是因为有无数个请求排列组合,在大多数情况下它们都受到Captcha或类似技术的保护。 - Ε Г И І И О

2

这样做主要是为了让您可以拥有两个同名的操作,一个用于GET请求,可能显示用户输入表单,另一个用于POST请求,当用户提交原始GET显示的表单时使用。如果这些操作没有以这种方式区分,则由于无法解析哪个操作意图处理请求,将会出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接