Как автоматически перегрузить DELETE и PUT, если они недоступны клиенту? - PullRequest
2 голосов
/ 10 октября 2010

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

1 Ответ

5 голосов
/ 10 октября 2010

Вы не можете определить, поддерживает ли клиент эти глаголы.Также для браузеров, которые не поддерживают глаголы 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, по-прежнему вызывать эти действия.

...