Удалить MVC, не попадая в метод HttpPost

Я использую MVC3. Я узнал, что удалять элемент с помощью метода HttpGet — плохая практика, поскольку любой может перейти по URL-адресу и удалить элемент. Итак, я хочу выполнить операцию удаления в методе HttpPost.

Проблема в том, что когда я нажимаю кнопку удаления, она попадает только в метод HttpGet, но не в метод HttpPost.

Я использовал webgrid и его файл index.cshtml.

<div id="DataTable">
@grid.GetHtml(htmlAttributes: new {id="gvMovies" },
columns:grid.Columns(
grid.Column("Title","Movie Title",canSort:true),
grid.Column("Director","Film Maker",canSort:false),   
grid.Column(header:"Action",
format:@<text>
<a href="@Url.Action("Edit", "Movies", new { id = @item.Id })">Edit</a>
@using (Html.BeginForm("Delete", "Movies", new { id = @item.id }, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ActionLink("Delete", "Delete", new { id = @item.id }, new { onclick = "return confirm('Are you sure you wish to delete this article?');" })
}

</text>)))
</div>

Страница контроллера выглядит следующим образом

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Delete(int id)
    {
        return RedirectToAction("Index");
    }

person SparAby    schedule 08.04.2014    source источник


Ответы (2)


Концептуально неправильно использовать глагол POST для удаления. POST - предназначен для размещения информации. Правильным способом было бы просто удалить атрибут из метода Delete и оставить его с помощью команды GET.

Теперь, если вам действительно действительно нужно использовать POST, ваша первая ошибка заключается в том, что вы создаете ссылку вместо кнопки отправки, которая отправит форму. Заменять

  @Html.ActionLink("Delete", "De...

с участием:

  <input type="submit" value="Delete">
person Radu Pascal    schedule 08.04.2014
comment
Если возможно, перейдите по этой ссылке Ссылки на удаление создают дыры в безопасности, и вы могли бы знать, почему я ненавижу выполнять удаление с помощью метода HttpGet - person SparAby; 08.04.2014
comment
Я понимаю ваше беспокойство, но должен сказать, что предложенное решение кажется неправильным. Автор поста говорит, что уязвима не только операция удаления, но и любая операция Get, которая изменяет данные. Я бы предпочел создать атрибуты безопасности, которые проверяли бы набор правил безопасности для действий, которые в противном случае могли бы быть уязвимы. Правилами могут быть: реферал и запрошенный тип контента. - person Radu Pascal; 08.04.2014

вы должны добавить кнопку отправки вместо ссылки, поэтому вы должны изменить
@Html.ActionLink("Delete" на <input type=submit value="del" >

если вы хотите отправить идентификатор в сообщении, вы можете добавить скрытый ввод в форму, чтобы вы могли добавить что-то подобное перед кнопкой отправки в форме

<input type="hidden" [email protected] name="itemid" >

так что я думаю, что этот код будет работать

    @using (Html.BeginForm("Delete", "Movies", new { id = @item.id }, FormMethod.Post, new { enctype = "multipart/form-data" }))

    {
       <input type="hidden" [email protected] name="itemid" >
      <input type=submit value="del" >
    }
person MHF    schedule 08.04.2014