Разница между двумя заключается в следующем: предположим, что метод Create
находится на HomeController
.
Использование атрибута AcceptVerbs
не влияет на маршрутизацию. Это на самом деле что-то, что используется вызывающим действием. То, что это позволяет сделать, это иметь 2 метода действий на контроллере с тем же именем, каждый из которых отвечает на другой метод HTTP.
public ActionResult Create(int id) { .. }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }
Таким образом, когда запрос /home/create
приходит, маршрут будет соответствовать и передавать запрос на запустившем контроллере. Затем invoker вызывает правильный метод, рассматривая атрибут AcceptVerbs
.
Использование маршрута HttpMethodConstraint
в маршрутизации сделает его таким, чтобы сам маршрут не соответствовал запросу. Поэтому, когда запрос POST приходит для /home/create
, ни один из методов действия не будет вызван, потому что этот маршрут не будет соответствовать запросу. Возможно, что другой маршрут будет соответствовать этому запросу.
Часть причины перекрытия здесь заключается в том, что маршрутизация является функцией ASP.NET 3.5 SP1 и не является специфичной для MVC. MVC использует маршрутизацию, но Маршрутизация также используется динамическими данными, и мы планируем интегрировать маршрутизацию с помощью ASP.NET Web Forms.
@Phil: я понимаю первую часть о том, как контролер контроллера выбирает лучший метод, основанный на AcceptVerbs. Я не понимаю вторую часть. Вы говорите, что если вы используете HttpMethodConstraint, он не знает, какой метод Create использовать? – 2008-11-13 04:45:40