Вопрос

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

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

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

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

Это было полезно?

Решение

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

Используя AcceptVerbs Атрибут не влияет на маршрутизацию.На самом деле это то, что используется инициатором действия.Он позволяет вам иметь два метода действий на контроллере с одинаковым именем, каждый из которых отвечает на разные методы HTTP.

public ActionResult Create(int id) { .. }

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

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

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

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

Другие советы

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

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

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

Я предполагаю, что под капотом все это в любом случае делается механизмом маршрутизации.[редактировать:нет, см. пост Хаакеда]

Сначала украсьте так:

[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 }
           );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top