У меня есть несколько индексных страниц, где в строке есть ссылка на действие, например
@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).
Любые мысли о аккуратном решении? Спасибо.