ASP.NET MVC AcceptVerbs и регистрация маршрутов

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

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

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

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

3 ответов


разница между ними заключается в следующем: предположим, что Create способ в вопрос о HomeController.

С помощью AcceptVerbs атрибут не влияет на маршрутизацию. Это на самом деле что-то, используемое вызывающим действие. Это позволяет вам иметь 2 метода действий на контроллере с тем же именем, которые каждый отвечает на другой метод HTTP.

public ActionResult Create(int id) { .. }

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

Итак, когда запрос /home/create приходит в, маршрут будет соответствовать и передать запрос на вызывающий контроллер. Затем вызывающий вызывает правильный метод, глядя на .

С помощью сделает его таким, что сам маршрут не будет соответствовать запросу. Поэтому, когда приходит запрос POST для /home/create, ни один метод действия не будет вызван, потому что этот маршрут не будет соответствовать запросу. Возможно, что другой маршрут будет соответствует этому запросу.

часть причины перекрытия здесь заключается в том, что Маршрутизация является особенностью ASP.NET 3.5 SP1 и не относится к MVC. MVC использует маршрутизацию, но маршрутизация также используется динамическими данными, и мы планируем интегрировать маршрутизацию с ASP.NET веб-формы.


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

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

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

Я предполагаю, что под капотом все это делается двигателем маршрутизации в любом случае. [edit: нет, см. сообщение 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 }
           );