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

时间:2011-03-16 21:50:55

标签: asp.net-mvc attributes http-post http-get

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

4 个答案:

答案 0 :(得分:55)

想象一下:

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

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

除非使用 ActionMethodSelectorAttributes HttpGetHttpPost,否则无法做到这一点。 这使得创建编辑视图变得非常简单。所有动作链接都只是指向控制器。如果视图模型验证为false,则只需再次弹回编辑视图。

我会大胆地说,这是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属性的操作将处理请求。

答案 1 :(得分:9)

因此你可以有多个使用相同名称的Actions,你可以使用HttpPost属性来标记在Post请求上处理哪个方法,如下所示:

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

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

        return View();
    }

答案 2 :(得分:9)

就HttpGet和HttpPost的最佳实践而言,在任何Web开发中使用HttpPost进行创建,更新和删除(数据修改)都是一种很好的做法。帖子很好,因为它们需要表单提交,这可以防止用户在电子邮件,社交网站等中点击有毒链接(例如[https://www.mysite.com/Delete/1])并无意中更改数据。如果你基本上只是阅读数据HttpGet工作得很好。

有关更深入的安全注意事项以及验证令牌提高安全性的原因,请参阅OWASP

答案 3 :(得分:2)

这主要是为了让你有两个同名的动作, 一个用于GET并且可能显示用户输入的表单,另一个用于POST,当用户提交原始GET显示的表单时。如果不以这种方式区分操作,则由于无法解决哪个Action旨在处理请求而发生错误。