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 приходит, маршрут будет соответствовать и передать запрос вызывающему контролеру. Затем вызывающий вызывает правильный метод, посмотрев на AcceptVerbs приписывать.

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

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

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

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

Если бы это был ваш единственный метод 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 }
           );
Другие вопросы по тегам