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

the*_*row 2 rest asp.net-mvc http-verbs action-filter actionfilterattribute

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

Dar*_*rov 5

您无法检测客户端是否支持这些动词.同样对于不支持的浏览器PUTDELETE动词HTML表单中您可以使用HttpMethodOverride表单里面助手将一个隐藏字段添加到窗体,将指示运行时尽管来调用适当的控制器动作,根据盖一个POST请求已发送.

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

这将调用装饰的动作[HttpDelete]:

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

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