Это моё решение проблемы.
Это контроллер с двумя методами действия
public class FeedbackController : Controller
{
public ActionResult Index()
{
var feedbacks =dataFromSomeSource.getData;
return View(feedbacks);
}
[System.Web.Mvc.HttpDelete]
[System.Web.Mvc.Authorize(Roles = "admin")]
public ActionResult Delete([FromBody]int id)
{
return RedirectToAction("Index");
}
}
В представлении я отображаю следующую структуру.
<html>
..
<script src="~/Scripts/bootbox.min.js"></script>
<script>
function confirmDelete(id) {
bootbox.confirm('@Resources.Resource.AreYouSure', function(result) {
if (result) {
document.getElementById('idField').value = id;
document.getElementById('myForm').submit();
}
}.bind(this));
}
</script>
@using (Html.BeginForm("Delete", "Feedback", FormMethod.Post, new { id = "myForm" }))
{
@Html.HttpMethodOverride(HttpVerbs.Delete)
@Html.Hidden("id",null,new{id="idField"})
foreach (var feedback in @Model)
{
if (User.Identity.IsAuthenticated && User.IsInRole("admin"))
{
@Html.ActionLink("Delete Item", "", new { id = @feedback.Id }, new { onClick = "confirmDelete("+feedback.Id+");return false;" })
}
}
...
</html>
Достопримечательности в Razor View :
функция JavaScript confirmDelete(id)
, которая вызывается при нажатии на ссылку, созданную с помощью @Html.ActionLink
;
confirmDelete()
функция требуется идентификатор элемента, по которому щелкают. Этот элемент передается из onClick
handler confirmDelete("+feedback.Id+");return false;
Обратите внимание, что обработчик возвращает false, чтобы предотвратить действие по умолчанию, то есть запрос get для цели. OnClick
событие для кнопок может быть присоединено с помощью jQuery для всех кнопок в списке в качестве альтернативы (возможно, это будет еще лучше, поскольку на HTML-странице будет меньше текста и данные можно будет передавать через атрибут data-
).
Форма имеет id=myForm
, чтобы найти ее в confirmDelete()
.
Форма включает @Html.HttpMethodOverride(HttpVerbs.Delete)
для использования глагола HttpDelete
в качестве действия, помеченного HttpDeleteAttribute
.
В функции JS я использую подтверждение действия (с помощью внешнего плагина, но стандартное подтверждение тоже отлично работает. Не забудьте использовать bind()
при обратном вызове или var that=this
(что вы предпочитаете) .
Форма имеет скрытый элемент с id='idField'
и name='id'
. Таким образом, перед отправкой формы после подтверждения (result==true
), значение скрытого элемента устанавливается равным значению переданного аргумента, и браузер отправляет данные в контроллер следующим образом:
Запрос URL : http://localhost:38874/Feedback/Delete
Способ запроса : Код состояния POST: 302 Найдено
Заголовки ответа
Расположение: / Обратная связь
Ведущий: локальный: 38874
Данные формы X-HTTP-метод-переопределение: УДАЛИТЬ id: 5
Как вы видите, это POST-запрос с X-HTTP-Method-Override: DELETE и данными в теле, установленными в "id: 5". Ответ содержит код 302, который перенаправляет на действие «Индекс», тем самым вы обновляете свой экран после удаления.