Как я могу обнаружить при запуске приложения, что клиент не поддерживает DELETE
и PUT
глаголов и автоматически перегружает глагол POST?
На стороне сервера, как я могу перенаправить эти перегруженные глаголы POST в правильные действия?
Скажите, что у меня есть запрос DELETE, который переопределен, как мне вызвать соответствующую функцию в контроллере, которая соответствует действию?
Я предполагаю, что я должен использовать некоторый фильтр действий и использовать отражение для проверки атрибутов, соответствующих моей функции (в этом примере: DeleteFoo(Guid Id)
).Как автоматически перегрузить DELETE и PUT, если они недоступны клиенту?
ответ
Вы не можете определить, поддерживает ли клиент эти глаголы или нет. Также для браузеров, которые не поддерживают PUT
и DELETE
глаголов в форматах html, вы можете использовать вспомогательный помощник HttpMethodOverride в своей форме, который добавит скрытое поле в форму, которая будет давать указание исполняемому файлу вызвать правильное действие контроллера, несмотря на то, что под обложками a 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
глаголы, чтобы все еще ссылаться на эти действия.
Но как насчет запросов ajax? –
Что с ними? AJAX запрашивает поддержку PUT и DELETE глаголов, поэтому вам не нужно дополнительное скрытое поле. Они будут автоматически отправлены на правильное действие контроллера на основе HTTP-глагола, который вы используете: '$ .ajax ({url: '/ products/destroy/123', введите:« DELETE », успех: функция (результат) {alert ('product deleted');}}); ' –
Почему запросы ajax поддерживают PUT и DELETE, а запросы обычной формы - нет? –