Http***Attribute и перегрузка типов запросов
Ранее в ASP.NET MVC для ограничения выполнения действия в ответ на тип запроса применялся атрибут AcceptverbsAttribute с параметрами из перечисления HttpVerbs. В ASP.NET MVC 2 представлены альтернативные атрибуты для короткой записи: HttpPostAttribute, HttpPutAttribute, HttpGetAttribute, HttpDeleteAttribute.
Кроме атрибутов сокращенной формы, ASP.NET MVC 2 предлагает еще один механизм работы с запросами, который нацелен на REST-сценарии. При работе с REST-приложениями важной задачей ставится правильное оперирование типами запросов. Однако не все браузеры поддерживают типы запросов типа PUT или DELETE. Для преодоления этой проблемы в MVC 2 вводится новый метод расширения Html.HttpMethodOverride, который используется для перегрузки типа запроса, применяемого на форме. Например, в следующем коде формируется POST-форма (по умолчанию) с перегрузкой параметра запроса в PUT с помощью Html.HttpMethodOverride:
<% using(Html.BeginForm()) {%>
<%= Html.HttpMethodDverride(HttpVerbs.Put) %>
<%} %>
Этот механизм работает следующим образом: вызов Html.HttpMethodOverride формирует на форме следующее скрытое поле:
<input name="X-HTTP-Method-Override" type="hidden" value="PUT" />
При получении запроса с формы ASP.NET MVC ищет скрытое поле со значением X-HTTP-Method-Override и, если оно найдено, предполагает, что запрос представляет собой тип, указанный в скрытом поле. Таким образом, указанный ранее пример вызовет действие, помеченное атрибутом HttpPut, но не HttpPost, т. к. форма содержит перегруженный тип запроса. Перегрузка значения может выполняться не только с помощью скрытого поля, но и с помощью заголовков HTTP или параметров строки запроса.
Следует учесть, что перегрузка запросов возможна только для POST-запросов. Во всех других случаях скрытый параметр X-HTTP-Method-Override игнорируется.