使用 AJAX 调用获取表单时使用 AntiForgeryToken?
Use AntiForgeryToken when form was fetched using AJAX call?
----------------更新,向下滚动原始问题---------------------
$.ajax 调用中的这两个设置(我根本没有注意到)对我来说是错误的:
contentType: false,
processData: false
Ajax posts with AntiForgeryTokens 在动态生成的表单中工作正常,当这两个设置被删除并且 AntiForgeryToken 在 PartialView 中生成时,如 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 调用。
如果我 post 从第一个选项卡返回(使用表单提交或 ajax post),我在 Controller 方法上使用 ValidateAntiForgeryToken,它工作正常。我可以 post 返回整个表单,或者将 __RequestVerificationToken 隐藏输入的值附加到正在 post 编辑的数据中。这两种方法都适用于第一个选项卡。
当我从任何其他选项卡 post 时出现问题。
如果用户选择任何其他选项卡,这会导致触发 javascript 方法,进而对控制器方法进行 ajax GET 调用,进而 returns 一个分部视图。此 PartialView 包含一个表单。在 ajax GET 调用的成功事件中,我通过调用 jquery html() 显示控制器方法返回的 html。然后,我通过 $.validator.unobtrusive.parse 传递动态生成的表单,以便我可以使用不显眼的验证。所有这一切都很好。
唯一的问题是,当我从这个动态生成的表单 post 返回到服务器时,我想用 ValidateAntiForgeryToken 属性修饰 Controller 方法。 las,当我这样做时,我得到一个 HttpAntiForgeryException。
我试过在动态生成的表单中(即在 PartialView 中)包含 @Html.AntiForgeryToken() 调用。这会生成预期的 __RequestVerificationToken 隐藏输入,但是当我将此值传递回控制器时,它会导致 HttpAntiForgeryException。
我也试过从第一个选项卡中获取 __RequestVerificationToken,我想也许这就是控制器 "expecting." 唉,这也会导致 HttpAntiForgeryException。
当我 post 从这些延迟加载的 ajax 生成的表单之一返回时,有什么方法可以使用 AntiForgeryToken/ValidateAntiForgeryToken 吗?
绝对可能,通过动态序列化表单数据以在每次 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 调用。如果你在你的方法中放置一个断点,你应该看到你实际上能够到达。
----------------更新,向下滚动原始问题---------------------
$.ajax 调用中的这两个设置(我根本没有注意到)对我来说是错误的:
contentType: false,
processData: false
Ajax posts with AntiForgeryTokens 在动态生成的表单中工作正常,当这两个设置被删除并且 AntiForgeryToken 在 PartialView 中生成时,如 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 调用。
如果我 post 从第一个选项卡返回(使用表单提交或 ajax post),我在 Controller 方法上使用 ValidateAntiForgeryToken,它工作正常。我可以 post 返回整个表单,或者将 __RequestVerificationToken 隐藏输入的值附加到正在 post 编辑的数据中。这两种方法都适用于第一个选项卡。
当我从任何其他选项卡 post 时出现问题。
如果用户选择任何其他选项卡,这会导致触发 javascript 方法,进而对控制器方法进行 ajax GET 调用,进而 returns 一个分部视图。此 PartialView 包含一个表单。在 ajax GET 调用的成功事件中,我通过调用 jquery html() 显示控制器方法返回的 html。然后,我通过 $.validator.unobtrusive.parse 传递动态生成的表单,以便我可以使用不显眼的验证。所有这一切都很好。
唯一的问题是,当我从这个动态生成的表单 post 返回到服务器时,我想用 ValidateAntiForgeryToken 属性修饰 Controller 方法。 las,当我这样做时,我得到一个 HttpAntiForgeryException。
我试过在动态生成的表单中(即在 PartialView 中)包含 @Html.AntiForgeryToken() 调用。这会生成预期的 __RequestVerificationToken 隐藏输入,但是当我将此值传递回控制器时,它会导致 HttpAntiForgeryException。
我也试过从第一个选项卡中获取 __RequestVerificationToken,我想也许这就是控制器 "expecting." 唉,这也会导致 HttpAntiForgeryException。
当我 post 从这些延迟加载的 ajax 生成的表单之一返回时,有什么方法可以使用 AntiForgeryToken/ValidateAntiForgeryToken 吗?
绝对可能,通过动态序列化表单数据以在每次 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 调用。如果你在你的方法中放置一个断点,你应该看到你实际上能够到达。