Почему селектор метода действия MVC не выбирает мое действие HttpPut? - PullRequest
2 голосов
/ 02 февраля 2012

С учетом следующего маршрута:

context.MapRoute(null, "widgets", 
    new { controller = "Widgets", action = "Add" }, 
    new { httpMethod = new HttpMethodConstraint("PUT") });

И следующий контроллер:

public class WidgetsController
{
    [HttpPut]
    public ActionResult Add(WidgetForm model)
    {
        return DoStuff(); // code here doesn't matter
    }
}

И представление, которое отображает следующую форму (используя HtmlHelper.@Html.HttpMethodOverride(HttpVerbs.Put):

<form action="/widgets" method="post">
    <!-- many form elements, then -->
    <input name="X-HTTP-Method-Override" type="hidden" value="PUT" />
</form>

Когда форма отправлена, селектор метода действия MVC не выбирает вышеуказанный метод действия. Если я устанавливаю точку останова на открывающей скобке, она никогда не срабатывает. В браузере он возвращает страницу 404 (я считаю, что это поведение ActionNotFound по умолчанию).

Однако селектор метода действия выбирает метод Add HttpPut со следующим маршрутом:

context.MapRoute(null, "widgets", 
    new { controller = "Widgets", action = "Add" }, 
    new { httpMethod = new HttpMethodConstraint("PUT", "POST") });

Это кажется неправильным ... не так ли? Мне кажется, что я должен быть в состоянии сделать это без ограничения POST. Метод действия не оформлен с помощью HttpPost, поэтому зачем нужно ограничение POST?

1 Ответ

2 голосов
/ 02 февраля 2012

Это правильно. Если посмотреть немного глубже, как это работает в конвейере MVC, то это на самом деле MVC (ActionMethodSelectorAttribute, ActionInvoker, RedirectToRoute), который обрабатывает это, а не RouteModule.

Таким образом, в модуле маршрута это все еще запрос POST, а не PUT.

...