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

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

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

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

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


person Pure.Krome    schedule 12.11.2008    source источник


Ответы (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.

person Haacked    schedule 12.11.2008
comment
@Phil: я понимаю первую часть о том, как инициатор контроллера выбирает лучший метод на основе AcceptVerbs. Я не понимаю вторую часть. Вы говорите, что если вы используете HttpMethodConstraint, он не будет знать, какой метод Create использовать? - person Pure.Krome; 13.11.2008
comment
Нет, я говорю, что использование ограничения означает, что сам маршрут не совпадает. Если ни один маршрут не совпадает, то запрос не передается MVC в первую очередь. - person Haacked; 19.11.2008
comment
@Haacked - этому сообщению уже много лет, но у меня есть вопрос относительно обоих этих методов. Я использую MVC3 и пытаюсь создать API JSON для своего приложения в стиле RESTful. Это означает, что у меня есть один маршрут, который должен обрабатывать 3 глагола (POST, PUT, DELETE) - было бы разумнее использовать ограничение на уровне маршрутизации и просто иметь 3 отдельных действия, подключенных к маршрутам... или лучше построить атрибут в среде MVC, который захватывает несколько глаголов и передает их в качестве аргумента действию? - person one.beat.consumer; 23.12.2011
comment
@Haacked - чтобы исправить себя и быть более конкретным, GET, PUT, DELETE имеют одну и ту же подпись маршрута /objName/{id}, и я пытаюсь иметь одно действие контроллера, которое обрабатывает все три глагола -или- 3 действия (по одному для каждого глагола) но то же имя и та же сигнатура метода (невозможно только с атрибутами) - person one.beat.consumer; 23.12.2011
comment
Если вы хотите, чтобы их обрабатывал один и тот же метод, используйте для него 3 атрибута: [HttpPost][HttpGet][HttpDelete]public ActionResult MyMethod(){} - person Haacked; 06.01.2012

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

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

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

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

person anonymous    schedule 12.11.2008
comment
Да, я все это понимаю, но вопрос не в этом. В чем разница между атрибутом AcceptVerb и ограничением HttpVerb, определенным в определении маршрута? Ничего... просто куда плывет ваша лодка? - person Pure.Krome; 13.11.2008

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

[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 }
           );
person MrByte    schedule 30.03.2010