0

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

@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 的代码运行良好:

$.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 OnBegin 方法将按钮包装在表单中,但不显眼的 ajax 库似乎没有传递对导致 ajax get/post 的元素的任何引用(在我看来很愚蠢 - 你可以对此表示赞同codeplex上的问题)。

对简洁的解决方案有任何想法吗?谢谢你。

4

1 回答 1

1

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

请参阅使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()

于 2013-06-11T01:51:05.310 回答