2008-11-12 3 views
21

Должен ли я регистрировать ограничение HttpVerb в определении маршрута (когда я регистрирую маршруты), если я уже украсил свой метод действия с помощью атрибута [AcceptVerbs (..)]?ASP.NET MVC AcceptVerbs и протоколы регистрации

например. у меня есть это.

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

Мне нужно добавить это к маршруту, который относится к этому действию, в качестве ограничения?

ответ

33

Разница между двумя заключается в следующем: предположим, что метод 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.

+0

@Phil: я понимаю первую часть о том, как контролер контроллера выбирает лучший метод, основанный на AcceptVerbs. Я не понимаю вторую часть. Вы говорите, что если вы используете HttpMethodConstraint, он не знает, какой метод Create использовать? – 2008-11-13 04:45:40

4

Nope - Create будет отвечать только на запросы POST.

У вас могут быть другие реализации Create с различными атрибутами AcceptVerb или один без атрибута, который поймает все остальные запросы.

Если это ваш метод только создать любой GET (или другой не-POST) запрос приведет к 404.

я предполагаю, под капотом все это делается с помощью модуля маршрутизации в любом случае. [edit: nope, см. сообщение Haacked's]

+1

Yep - я все понимаю, но это не вопрос. В чем разница между атрибутом 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 } 
      ); 
Смежные вопросы