ASP MVC 4 Ajax.ActionLink для удаления с использованием AntiForgeryToken

У меня есть несколько индексных страниц, где в строке есть ссылка на действие, например

@Ajax.ActionLink("Delete", "Delete", "AdverseEvent", new { id = Model.AdverseEventId }, new AjaxOptions { HttpMethod = "Post",OnSuccess = "rowDeleted", LoadingElementId="ajaxRequest_processing", Confirm = String.Format("Are you sure you want to delete adverse event for participant {0} at {1} ?", Model.ParticipantId, Model.EventTime) }, new { @class = "deleteAction" })

Ссылка на действие — отличный способ использовать прогрессивное улучшение, потому что, конечно, есть также действие удаления с методами get и post для выполнения удаления для тех, у кого отключен javascript.

Мне нужно добавить AntiForgeryToken. Для помощника Ajax.BeginForm Джона Уайта прекрасно работает:

$.ajaxPrefilter(function (options, localOptions, jqXHR) {
    var type = options.type.toLowerCase();
    if (type === 'post') {
        var token = GetAntiForgeryToken();
        jqXHR.setRequestHeader(token.name, token.value);
    }
});

Когда это выполняется в actionlink, я предполагаю, что из-за того, что индексная таблица не заключена в форму, я получаю сообщение об ошибке:

The required anti-forgery form field "__RequestVerificationToken" is not present

Таким образом, я мог бы обернуть всю таблицу в форму, отсылающую обратно к действию удаления, но тогда это не очень удобно, если я хочу использовать другие ссылки ajax.action для разных действий в таблице. Я мог бы обернуть каждую ссылку действия в ее собственную форму, каждая со своим токеном защиты от подделки, но это значительный объем дополнительной разметки, и на странице останутся десятки элементов с одинаковыми значениями и именами. Другим вариантом было бы использовать метод ActionLink OnBegin для переноса кнопки в форму, но ненавязчивая библиотека ajax, похоже, не передает никакой ссылки на элемент, вызывающий получение/публикацию ajax (на мой взгляд, глупо - вы можете проголосовать за это проблема в codeplex).

Любые мысли о аккуратном решении? Спасибо.


person Brent    schedule 11.06.2013    source источник
comment
AntiForgeryToken необходимо передать как параметр формы, связанный код передает его через заголовок. См. этот пост с тем самым ajaxPrefilter stackoverflow.com/a/16495855/2030565 и альтернативной версией, которая будет работать.   -  person Jasen    schedule 11.06.2013
comment
возможный дубликат Как включить @Html.AntiForgeryToken() при удалении объекта с помощью ссылки Удалить   -  person Mark Rotteveel    schedule 10.10.2014


Ответы (1)


Вы можете добавить токен на страницу, а затем использовать Ajax для отправки поля в другом вызове.

см. Как включить @ Html.AntiForgeryToken() при удалении объекта с помощью ссылки Удалить

person Ross Bush    schedule 11.06.2013
comment
Большое спасибо - я поражен, что мои поиски не наткнулись на это! - person Brent; 11.06.2013