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