21

如果我已经用 [AcceptVerbs(..)] 属性修饰了我的操作方法,我是否必须在我的路由定义中注册 HttpVerb 约束(当我注册路由时)?

例如。我有这个。

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

我是否需要将此添加到引用此操作的路由中,作为约束?

4

3 回答 3

33

两者之间的区别如下:假设有Create问题的方法在HomeController.

使用该AcceptVerbs属性不会影响路由。它实际上是动作调用者使用的东西。它允许您做的是在一个控制器上拥有 2 个具有相同名称的操作方法,每个方法响应不同的 HTTP 方法。

public ActionResult Create(int id) { .. }

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

因此,当请求/home/create进入时,路由将匹配并将请求传递给控制器​​的调用者。然后调用者通过查看AcceptVerbs属性调用正确的方法。

使用HttpMethodConstraintin 路由将使路由本身与请求不匹配。因此,当 POST 请求进入时/home/create,不会调用任何操作方法,因为该路由与请求不匹配。不过,另一条路线可能匹配该请求。

此处重叠的部分原因是路由是 ASP.NET 3.5 SP1 的一项功能,并非特定于 MVC。MVC 使用路由,但动态数据也使用路由,我们计划将路由与 ASP.NET Web 窗体集成。

于 2008-11-12T23:43:44.060 回答
4

不—— Create 只会响应 POST 请求。

您可以拥有其他具有不同 AcceptVerb 属性的 Create 实现,或者一个没有将捕获所有其他请求的属性的实现。

如果这是您唯一的 Create 方法,那么任何 GET(或其他非 POST)请求都会导致 404。

我假设这一切都是由路由引擎完成的。[编辑:不,见 Haacked 的帖子]

于 2008-11-12T14:04:17.177 回答
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 }
           );
于 2010-03-30T23:04:26.210 回答