DELETE方法不起作用

时间:2014-01-27 19:09:45

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

我编写了一个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方法。

任何人都知道为什么?我尝试了各种各样的变体,但我无法得到名为的删除方法。

2 个答案:

答案 0 :(得分:1)

浏览器通常只能对表单元素执行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

答案 1 :(得分:1)

@DimitryS的回答是正确的,但我想我会稍微建立一下。

HTML表单只允许GET和POST操作。这是HTML 5 spec中的当前内容以及HTML&lt; 4规格

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

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

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