ASP.NET MVC AcceptVerbs и регистрация маршрутов - PullRequest
21 голосов
/ 12 ноября 2008

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

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

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

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

Ответы [ 3 ]

33 голосов
/ 13 ноября 2008

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

4 голосов
/ 12 ноября 2008

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

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

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

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

1 голос
/ 31 марта 2010

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

[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 }
           );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...