2

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

4

1 回答 1

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动词仍然调用这些操作。

于 2010-10-10T15:59:17.497 回答