我有很多索引页面,其中行有一个像这样的动作链接
@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)。
有关整洁解决方案的任何想法?谢谢。
答案 0 :(得分:1)
您可以将令牌添加到页面中,然后使用Ajax在另一个调用中发送字段。
请参阅How to include the @Html.AntiForgeryToken() when deleting an object using a Delete link