С учетом следующего маршрута:
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?