如果我已经用 [AcceptVerbs(..)] 属性修饰了我的操作方法,我是否必须在我的路由定义中注册 HttpVerb 约束(当我注册路由时)?
例如。我有这个。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
我是否需要将此添加到引用此操作的路由中,作为约束?
如果我已经用 [AcceptVerbs(..)] 属性修饰了我的操作方法,我是否必须在我的路由定义中注册 HttpVerb 约束(当我注册路由时)?
例如。我有这个。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
我是否需要将此添加到引用此操作的路由中,作为约束?
两者之间的区别如下:假设有Create
问题的方法在HomeController
.
使用该AcceptVerbs
属性不会影响路由。它实际上是动作调用者使用的东西。它允许您做的是在一个控制器上拥有 2 个具有相同名称的操作方法,每个方法响应不同的 HTTP 方法。
public ActionResult Create(int id) { .. }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }
因此,当请求/home/create
进入时,路由将匹配并将请求传递给控制器的调用者。然后调用者通过查看AcceptVerbs
属性调用正确的方法。
使用HttpMethodConstraint
in 路由将使路由本身与请求不匹配。因此,当 POST 请求进入时/home/create
,不会调用任何操作方法,因为该路由与请求不匹配。不过,另一条路线可能会匹配该请求。
此处重叠的部分原因是路由是 ASP.NET 3.5 SP1 的一项功能,并非特定于 MVC。MVC 使用路由,但动态数据也使用路由,我们计划将路由与 ASP.NET Web 窗体集成。
不—— Create 只会响应 POST 请求。
您可以拥有其他具有不同 AcceptVerb 属性的 Create 实现,或者一个没有将捕获所有其他请求的属性的实现。
如果这是您唯一的 Create 方法,那么任何 GET(或其他非 POST)请求都会导致 404。
我假设这一切都是由路由引擎完成的。[编辑:不,见 Haacked 的帖子]
首先这样装饰:
[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 }
);