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

所以我们有[HttpPost],这是一个可选的属性。 我明白这限制了通话,所以只能通过HTTP POST请求来完成。 我的问题是为什么我想这样做?

想象一下:

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

这是不可能的,除非ActionMethodSelectorAttributes HttpGetHttpPost在哪里使用。 这使得创build编辑视图非常简单。 所有的行动链接只是直接指向控制器。 如果视图模型validation为false,则只需再次弹回到编辑视图。

我会大胆的说,这是最好的实践,当涉及到在ASP.NET MVC CRUD的东西。

编辑:

@ TheLight问道,为了完成这个职位,需要什么。 这只是一个POST方法的表单。

使用剃刀,这将看起来像这样。

 @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来创build,更新和删除(数据修改)是一个很好的做法。 邮政是好的,因为他们需要一个表单提交,防止用户点击电子邮件,社交网站等中毒链接(例如[ https://www.mysite.com/Delete/1%5D ),并无意中更改数据。 如果你基本上只是读取数据HttpGet的作品很好。

请参阅OWASP以获得更深入的安全性考虑,以及validation令牌为什么会增加安全性。

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

  public ActionResult ContactUs() { return View(); } [HttpPost] public ActionResult ContactUs(ContactUsModel model) { //do something with model return View(); } 

这主要是因为您可以拥有两个具有相同名称的动作,一个用于GET,一个用于用户input,另一个在用户提交原始GET显示的表单时用于POST。 如果操作没有以这种方式进行区分,则由于无法parsing哪个操作旨在处理请求而发生错误。