Как определить при запуске приложения, что клиент не поддерживает команды DELETE
и PUT
, и автоматически перегрузить команду POST?
Как на стороне сервера перенаправить эти перегруженные команды POST на нужные действия?< br> Скажем, у меня есть переопределенный запрос DELETE, как мне вызвать соответствующую функцию в контроллере, которая соответствует действию?
Я предполагаю, что мне следует использовать некоторый фильтр действий и использовать отражение для проверки атрибутов, которые соответствуют моему функция (в данном примере: DeleteFoo(Guid Id)
).
Как автоматически перегрузить DELETE и PUT, если они недоступны клиенту?
Ответы (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
, по-прежнему вызывать эти действия.
$.ajax({ url: '/products/destroy/123', type: 'DELETE', success: function(result) { alert('product deleted'); } });
- person Darin Dimitrov; 10.10.2010