如果客户端无法使用DELETE和PUT,如何自动重载?

时间:2010-10-10 15:53:51

标签: asp.net-mvc rest action-filter actionfilterattribute httpverbs

如何在应用程序启动时检测到客户端不支持DELETEPUT动词并自动重载POST动词?
在服务器端,如何将重载的POST动词重定向到正确的动作中? 假设我有一个覆盖的DELETE请求,如何调用控制器中与该操作匹配的相应函数?
我的猜测是我应该使用一些动作过滤器并使用反射来检查与我的函数匹配的属性(在这个例子中:DeleteFoo(Guid Id))。

1 个答案:

答案 0 :(得分:5)

您无法检测客户端是否支持这些谓词。对于不支持html表单中的PUTDELETE谓词的浏览器,您可以在表单中使用HttpMethodOverride帮助器,这将在表单中添加隐藏字段,这将指示运行时

。尽管在封面下发送POST请求,但仍会调用适当的控制器操作。

<% using (Html.BeginForm("Destroy", "Products", new { id = "123" }, FormMethod.Post)) { %>
    <%: Html.HttpMethodOverride(HttpVerbs.Delete) %>
    <input type="submit" value="Delete" />
<% } %>

将调用以[HttpDelete]修饰的操作:

[HttpDelete]
public ActionResult Destroy(int id)
{
    // TODO: delete product
    TempData["message"] = "product deleted";
    return RedirectToAction("index");    
}

这里重要的是控制器不应该关心或依赖客户端支持的动词。如果使用正确的动词和名称以RESTful方式设计控制器,则此处显示的技术允许不支持PUTDELETE动词的客户端仍然调用这些操作。