2011-03-16 95 views

回答

52

想象一下以下内容:

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

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

除非ActionMethodSelectorAttributesHttpGetHttpPost用在了这将是不可能的。 这使得创建编辑视图非常简单。所有的操作链接都直接指向控制器。如果视图模型验证为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属性的动作将处理该请求。

+1

嗨Mikael,我喜欢你的答案,但我看到一个小的更正。 HttpGet和HttpPost不是ActionFilters,但它们是ActionSelectors。作为名称,ActionSelectors与ActionFilters不同。如果您看到源代码都是HttpGet和HttpPost,则它们源自直接从属性派生的ActionMethodSelectorAttribute。你可以将ActionFilters这个词替换成ActionSelectors吗? – VJAI 2013-01-10 10:08:29

+0

谢谢你的抬头,马克! – 2013-01-10 13:50:18

+0

应该在视图上写下什么内容才能发布到此操作? – 2013-02-26 10:03:51

2

这主要是为了让您可以有两个操作具有相同的名称, 一个这是对GET和可能用于显示用户输入和员额正在使用的其他形式,当用户提交的显示形式原始的GET。如果操作没有以这种方式区分,则由于无法解析哪个操作旨在处理请求而发生错误。

8

它让你可以有使用相同名称的多个操作,您可以使用HttpPost属性,以纪念其方法大干快上,像这样一个POST请求处理:

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

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

     return View(); 
    } 
+1

也许最好注意POST请求有可能以某种方式改变数据库的状态或修改网站的内部数据。这就是网络抓取工具从不遵循这些网址的原因。 – vbocan 2011-03-17 05:38:04

+1

我不认为今天的爬虫对于改变一个人的数据库或者修改内部数据都不在乎。如果抓取工具能成功找到通过post请求处理程序的方式,那么这是不足的 – 2012-03-16 06:55:18

+0

- 我将在服务器端进行验证。为什么抓取程序不主动跟踪帖子请求是因为有无数的请求排列,并且在大多数情况下,它们使用Captcha等进行保护。 – 2012-03-16 07:01:34

9

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

请参阅OWASP了解更深入的安全考虑以及验证令牌为何会提高安全性。