2

如何在應用程序啓動時檢測到客戶端不支持DELETEPUT動詞,並自動重載POST動詞?
在服務器端,我如何將那些過載的POST動詞重定向到正確的動作?
假設我有一個被覆蓋的DELETE請求,我如何在控制器中調用與該操作匹配的適當函數?
我的猜測是我應該使用一些操作過濾器並使用反射來檢查與我的函數相匹配的屬性(在本例中爲DeleteFoo(Guid Id))。如果客戶端不可用,如何自動重載DELETE和PUT?

回答

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");  
} 

這裏最重要的是,控制器不應該關心或依靠什麼動詞客戶端支持。如果您使用正確的動詞和名稱以REST風格設計控制器,則會出現如下所示的技術,允許不支持PUTDELETE動詞的客戶端仍然調用這些操作。

+0

但是,Ajax請求呢? – 2010-10-10 16:01:23

+1

他們呢? AJAX請求支持PUT和DELETE動詞,所以你不需要額外的隱藏字段。它們將根據您使用的HTTP動詞自動發送到適當的控制器操作:$ .ajax({url:'/ products/destroy/123',type:'DELETE',success:function(result){alert ('product deleted');}});' – 2010-10-10 16:02:35

+0

爲什麼ajax請求支持PUT和DELETE,而普通表單請求不支持? – 2010-10-10 16:11:06

相關問題