使用AntiForgeryToken进行删除的ASP MVC 4 Ajax.ActionLink

时间:2013-06-11 00:55:39

标签: asp.net-mvc-4 unobtrusive-ajax

我有很多索引页面,其中行有一个像这样的动作链接

@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帮助程序,Jon White's代码可以很好地工作:

$.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.actionlinks用于表格中的不同操作,那么这不是很整洁。我可以用自己的形式包装每个actionlink,每个都有自己的防伪令牌,但这是一个额外的标记,并会在页面上留下几十个具有相同值和名称的元素。另一个选择是使用ActionLink OnBegin方法将按钮包装在一个表单中,但不显眼的ajax库似乎没有传递任何引用ajax get / post的元素的引用(在我看来愚蠢 - 你可以支持这个问题codeplex)。

有关整洁解决方案的任何想法?谢谢。

1 个答案:

答案 0 :(得分:1)

您可以将令牌添加到页面中,然后使用Ajax在另一个调用中发送字段。

请参阅How to include the @Html.AntiForgeryToken() when deleting an object using a Delete link