Как автоматически перегрузить DELETE и PUT, если они недоступны клиенту?

Как определить при запуске приложения, что клиент не поддерживает команды DELETE и PUT, и автоматически перегрузить команду POST?
Как на стороне сервера перенаправить эти перегруженные команды POST на нужные действия?< br> Скажем, у меня есть переопределенный запрос DELETE, как мне вызвать соответствующую функцию в контроллере, которая соответствует действию?
Я предполагаю, что мне следует использовать некоторый фильтр действий и использовать отражение для проверки атрибутов, которые соответствуют моему функция (в данном примере: DeleteFoo(Guid Id)).


person the_drow    schedule 10.10.2010    source источник


Ответы (1)


Вы не можете определить, поддерживает ли клиент эти глаголы. Также для браузеров, которые не поддерживают глаголы PUT и DELETE в html-формах, вы можете использовать HttpMethodOverride внутри вашей формы, который добавит в форму скрытое поле, которое даст указание среде выполнения вызвать надлежащее действие контроллера, несмотря на то, что скрыто отправляется запрос POST.

<% using (Html.BeginForm("Destroy", "Products", new { id = "123" }, FormMethod.Post)) { %>
    <%: Html.HttpMethodOverride(HttpVerbs.Delete) %>
    <input type="submit" value="Delete" />
<% } %>

который вызовет действие, украшенное [HttpDelete]:

[HttpDelete]
public ActionResult Destroy(int id)
{
    // TODO: delete product
    TempData["message"] = "product deleted";
    return RedirectToAction("index");    
}

Здесь важно то, что контроллер не должен заботиться или зависеть от того, какие глаголы поддерживает клиент. Если вы проектируете свои контроллеры в стиле RESTful, используя правильные глаголы и имена, есть методы, подобные показанному здесь, которые позволяют клиентам, которые не поддерживают глаголы PUT и DELETE, по-прежнему вызывать эти действия.

person Darin Dimitrov    schedule 10.10.2010
comment
Но как насчет ajax-запросов? - person the_drow; 10.10.2010
comment
Что насчет них? Запросы AJAX поддерживают команды PUT и DELETE, поэтому вам не нужно дополнительное скрытое поле. Они будут автоматически отправлены в соответствующее действие контроллера на основе используемой вами команды HTTP: $.ajax({ url: '/products/destroy/123', type: 'DELETE', success: function(result) { alert('product deleted'); } }); - person Darin Dimitrov; 10.10.2010
comment
Почему ajax-запросы поддерживают PUT и DELETE, а обычные запросы — нет? - person the_drow; 10.10.2010
comment
@the_drow, поскольку в спецификации HTML 4.0 единственными возможными значениями для атрибут метода - это GET и POST, и я предполагаю, что разработчики браузеров хотели соответствовать спецификации. Что касается объекта XHR, я понятия не имею, почему он поддерживает глаголы PUT и DELETE в дополнение к GET и POST. - person Darin Dimitrov; 10.10.2010
comment
Изменится ли это в HTML 5.0 (EDIT: да) - person the_drow; 10.10.2010