Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

[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 }
           );