2008-11-12 108 views
21

如果我已經使用[AcceptVerbs(..)]屬性裝飾了我的操作方法,是否必須在我的路由定義中註冊HttpVerb約束(當我註冊路由時)?ASP.NET MVC AcceptVerbs和註冊路由

例如。我有這個。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection formCollection) 
{ .. } 

我是否需要將此參數添加到引用此操作的路由中,作爲約束?

回答

33

兩者之間的區別如下:我們假設Create方法在HomeController上。

使用AcceptVerbs屬性不會影響路由。它實際上是動作調用者使用的東西。它允許你做的是在控制器上有兩個相同名稱的動作方法,每個響應不同的HTTP方法。

public ActionResult Create(int id) { .. } 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection formCollection) { .. } 

所以當/home/create一個請求時,該路由將匹配和手從請求到控制器的調用。調用者然後通過查看AcceptVerbs屬性來調用正確的方法。

在路由中使用HttpMethodConstraint會使路由本身與請求不匹配。因此,當POST請求進入/home/create時,將不會調用任何操作方法,因爲該路由與請求不匹配。有可能另一條路線與該請求相匹配。

此處重疊的部分原因是路由是ASP.NET 3.5 SP1的一項功能,並不特定於MVC。 MVC使用路由,但動態數據也使用路由,我們計劃將路由與ASP.NET Web窗體集成。

+0

@Phil:我理解關於控制器的調用者如何根據AcceptVerbs選擇最佳方法的第一部分。我不明白第二部分。你是說如果你使用HttpMethodConstraint,它不知道使用哪個Create方法? – 2008-11-13 04:45:40

4

不能 - 創建將只響應POST請求。

您可以使用其他具有不同AcceptVerb屬性的Create實現,或者使用其他實現可以捕獲所有其他請求的屬性。

如果這是你的唯一的方法創建,任何GET(或其他非POST)請求,將導致404

我在引擎蓋下承擔這一切都是由路由引擎完成反正。 [編輯:不,請參閱Haacked的帖子]

+1

是的 - 那些我都明白,但是這不是問題。 在路由定義中定義的AcceptVerb屬性與HttpVerb約束之間有什麼區別?沒有什麼......只是以任何方式漂浮你的船? – 2008-11-12 23:08:07

1

首先裝點這樣的:

[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)] 
public virtual object ItemSave(Menu sampleInput) 

,那麼你需要添加這樣的路線:

AddRoute(
       "SampleEdit", 
       "Admin/{sampleID}/Edit", 
       new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true }, 
       new { areaID = new IsGuid() }, 
       new { Namespaces = controllerNamespaces } 
      );