【问题标题】:HttpPost vs HttpGet attributes in MVC: Why use HttpPost?MVC 中的 HttpPost 与 HttpGet 属性:为什么要使用 HttpPost?
【发布时间】:2011-03-16 21:50:55
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    想象一下:

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

    除非使用了 ActionMethodSelectorAttributes HttpGetHttpPost,否则这是不可能的。 这使得创建编辑视图变得非常简单。所有的动作链接都直接指向控制器。如果视图模型验证为假,您只需再次弹回编辑视图。

    当涉及到 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 属性的操作将处理请求。

    【讨论】:

    • 嗨,Mikael,我喜欢你的回答,但我看到了一个小的更正。 HttpGet 和 HttpPost 不是 ActionFilter,但它们是 ActionSelector。顾名思义,ActionSelectors 与 ActionFilters 不同。如果您看到 HttpGet 和 HttpPost 的源代码,它们都派生自 ActionMethodSelectorAttribute,后者直接派生自 Attribute。可以把 ActionFilters 换成 ActionSelectors 吗?
    • 感谢您的提醒,马克!
    • 应该在视图上写什么来发布到这个动作?
    【解决方案2】:

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

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

    【讨论】:

    • 注意 POST 请求有可能以某种方式改变数据库的状态或修改网站的内部数据可能是个好主意。这就是网络爬虫从不跟踪此类 URL 的原因。
    • 我不认为今天的爬虫会在乎改变数据库或修改内部数据。如果爬虫可以成功通过发布请求处理程序找到自己的方式,那是不够的
    • - 我想说的是服务器端的验证。为什么爬虫不主动跟踪发布请求是因为请求排列的数量无穷无尽,并且在大多数情况下,它们使用验证码等进行保护。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这主要是为了让你可以有两个同名的Action, 一个用于 GET 并可能显示用户输入的表单,另一个在用户提交原始 GET 显示的表单时用于 POST。如果没有这样区分Action,就会因为无法解析出哪个Action来处理请求而产生错误。

      【讨论】:

        最近更新 更多