我有许多索引页面,其中行有一个像这样的操作链接
@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上的问题)。
对简洁的解决方案有任何想法吗?谢谢你。