【问题标题】:DELETE method not working删除方法不起作用
【发布时间】:2014-02-18 19:15:29
【问题描述】:

我写了一个 WebApi 控制器,其中包含以下删除客户端的方法...

[HttpDelete]
public void DeleteClient(int id) {
  // do stuff here
}

...并且正在尝试通过在网页上使用以下 HTML 来对其进行测试...

<form method="DELETE" action="/api/ClientsXml/">
  <table style="padding: 5px">
    <tr>
      <td>ID</td>
      <td><input type="text" size="20" name="id" id="id" /></td>
    </tr>
    <tr>
      <td> </td>
      <td><input type="submit" value="Send" /></td>
    </tr>
  </table>
</form>

但是,永远不会调用 DeleteClient 方法。而是将请求传递给 GetClient 方法。

有人知道为什么吗?我尝试了各种变体,但就是无法调用 delete 方法。

【问题讨论】:

    标签: c# asp.net http asp.net-web-api


    【解决方案1】:

    @DimitryS 的回答是正确的,但我想我会在此基础上再做一点。

    HTML 表单只允许 GET 和 POST 操作。这是HTML 5 spec 以及 HTML

    使用 XMLHttpRequest 时允许使用其他 HTTP 方法,这是 jQuery 的 ajax 功能的基础。因此,一个不错的选择可能是将 jQuery 用于您的 PUT、DELETE,它应该适用于所有主流浏览器(在这个非常明确的 SO 问题中对此进行了一些讨论:Are the PUT, DELETE, HEAD, etc methods available in most web browsers?)。

    最后,我要说的是,如果您只是使用表单来测试您的 API,那么为什么不试试浏览器扩展: 例如

    还有更多,但大多数都允许您保存测试套件、设置不同的标头等等。

    【讨论】:

    • 感谢您的出色回复。正如我对德米特里所说,现在你指出这一点很明显,但我试图节省一些时间。您的回复增加了一些很好的信息。
    【解决方案2】:

    浏览器通常只能对表单元素执行 GET 或 POST(除非您使用 AJAX 提交)。

    您应该将表单方法更改为 POST 并添加以下 HTML 元素:

    <input name="X-HTTP-Method-Override" type="hidden" value="DELETE" />
    

    这就是 MVC 允许为同步 POST 覆盖 HTTP 方法的方式。

    编辑:这篇文章解释了如何使 Web API 支持相同的约定: https://stackoverflow.com/a/13135848/395359

    【讨论】:

    • 非常感谢。真的有点明显!偷工减料是我的错!
    猜你喜欢
    • 2018-12-22
    • 2016-08-30
    • 2013-06-03
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多