2

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

ответ

5

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

+0

Но как насчет запросов ajax? –

+1

Что с ними? AJAX запрашивает поддержку PUT и DELETE глаголов, поэтому вам не нужно дополнительное скрытое поле. Они будут автоматически отправлены на правильное действие контроллера на основе HTTP-глагола, который вы используете: '$ .ajax ({url: '/ products/destroy/123', введите:« DELETE », успех: функция (результат) {alert ('product deleted');}}); ' –

+0

Почему запросы ajax поддерживают PUT и DELETE, а запросы обычной формы - нет? –

 Смежные вопросы

  • Нет связанных вопросов^_^