如果我已經使用[AcceptVerbs(..)]屬性裝飾了我的操作方法,是否必須在我的路由定義中註冊HttpVerb約束(當我註冊路由時)?ASP.NET MVC AcceptVerbs和註冊路由
例如。我有這個。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
我是否需要將此參數添加到引用此操作的路由中,作爲約束?
如果我已經使用[AcceptVerbs(..)]屬性裝飾了我的操作方法,是否必須在我的路由定義中註冊HttpVerb約束(當我註冊路由時)?ASP.NET MVC AcceptVerbs和註冊路由
例如。我有這個。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
我是否需要將此參數添加到引用此操作的路由中,作爲約束?
兩者之間的區別如下:我們假設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窗體集成。
不能 - 創建將只響應POST請求。
您可以使用其他具有不同AcceptVerb屬性的Create實現,或者使用其他實現可以捕獲所有其他請求的屬性。
如果這是你的唯一的方法創建,任何GET(或其他非POST)請求,將導致404
我在引擎蓋下承擔這一切都是由路由引擎完成反正。 [編輯:不,請參閱Haacked的帖子]
是的 - 那些我都明白,但是這不是問題。 在路由定義中定義的AcceptVerb屬性與HttpVerb約束之間有什麼區別?沒有什麼......只是以任何方式漂浮你的船? – 2008-11-12 23:08:07
首先裝點這樣的:
[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 }
);
@Phil:我理解關於控制器的調用者如何根據AcceptVerbs選擇最佳方法的第一部分。我不明白第二部分。你是說如果你使用HttpMethodConstraint,它不知道使用哪個Create方法? – 2008-11-13 04:45:40