---------------更新,向下滚动以查找原始问题----------------------
$。ajax调用中的这两个设置(我根本没有注意到)正在为我破坏它:
contentType: false,
processData: false
当删除这两个设置并且在PartialView中生成AntiForgeryToken时,以动态生成的形式包含AntiForgeryTokens的Ajax帖子可以正常工作,如Stephen Muecke的评论中所述。成功的$ .ajax调用如下所示,其中__RequestVerificationToken来自对部分视图中@HtmlAntiForgeryToken()的调用:
$.ajax({
url: '/MyUrl',
type: "POST",
data: {__RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val()
},
success: function (responseText) {
...and etc
----------下面的原始问题---------------------------------- --------
是否可以在通过ajax调用动态加载的表单上使用AntiForgeryToken?
在我的asp.net mvc应用程序中,我正在使用Jquery选项卡。页面加载时,我仅加载第一个标签。此第一个选项卡始终包含一个表单,并且此表单始终包含一个AntiForgeryToken。当用户选择其他选项卡时,它们会通过ajax调用进行延迟加载。
如果我从第一个选项卡发回(使用表单提交或Ajax发布),则在Controller方法上使用ValidateAntiForgeryToken,它可以正常工作。我可以回发整个表单,也可以将__RequestVerificationToken隐藏输入的值附加到要发布的数据中。两种方法都可以在第一个选项卡上正常工作。
当我从其他任何标签中发帖时,都会出现问题。
如果用户选择任何其他选项卡,则将导致触发javascript方法,进而对Controller方法进行ajax GET调用,该方法又返回PartialView。此PartialView包含一个表单。在ajax GET调用成功的情况下,我通过调用jquery html()显示Controller方法返回的html。然后,我通过$ .validator.unobtrusive.parse传递动态生成的表单,以便可以使用非侵入式验证。所有这些都很好。
唯一的问题是,当我从这种动态生成的表单发回服务器时,我想用ValidateAntiForgeryToken属性装饰Controller方法。 las,当我这样做时,我会收到HttpAntiForgeryException。
我尝试将@ Html.AntiForgeryToken()调用包含在动态生成的表单内(即PartialView内)。这样会生成预期的__RequestVerificationToken隐藏输入,但是当我将此值传递回Controller时,将导致HttpAntiForgeryException。
我也尝试过从第一个选项卡中获取__RequestVerificationToken,以为这就是Controller所“期望的”。 las,这还会导致HttpAntiForgeryException。
当我从这些延迟加载的,ajax生成的表单之一中发回邮件时,是否可以使用AntiForgeryToken / ValidateAntiForgeryToken?
答案 0 :(得分:2)
这是绝对可行的,并且可以通过动态序列化表单数据以在每次Ajax调用中传递AntiForgeryToken
来完成。
var data = $('#yourForm').serialize();
$.ajax({
type: 'POST',
url: "@Url.Action("yourMethod", "yourController")",
data: data,
cache: false,
success: function (response) {
// Your code here
}
});
使用Chrome中的Network
标签,您会看到令牌已附加到Ajax调用中。如果在方法中放置一个断点,则应该看到实际上可以触及。