gpt4 book ai didi

javascript - ValidateAntiForgeryToken 由于 AJAX 调用而失败

转载 作者:行者123 更新时间:2023-11-28 00:45:47 26 4
gpt4 key购买 nike

编辑:我尝试了更多的事情..请参阅此问题的结尾以获取更新

我正在尝试通过 AJAX 将一些数据以及 AntiForgeryToken 从 MVC 应用程序中的页面传递到 Controller 。这不是我唯一这样做的地方,但这是第一个不起作用的地方。

我的代码的java端是:

var dirtyFields = [];

$('.DirtyField').each(function () {
var newValue;

if ($(this).is('select'))
newValue = $(this).val();
else if ($(this).is('input[type="text"]'))
newValue = $(this).val();
else
newValue = ($(this).is(':checked')) ? 'true' : 'false';

dirtyFields.push({
FieldName: $(this).attr('name'),
OldValue: $(this).attr('data-oldvalue'),
NewValue: newValue
});
});

var token = $("#__AjaxAntiForgeryForm input").val();
var dataObject =
{
__RequestVerificationToken: token,
MaintUserId: $('#HiddenMaintUserID').val(),
ChangedFields: dirtyFields
};

$.ajax({
url: '@Url.Action("SaveDataAction", "SomeController")',
type: 'POST',
contentType: 'json',
data: dataObject,
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
}
}).done(function (result) {
if (result.Success == 'true') {
alert("User information was updated successfully!");
}
else {
alert("Update failed!");
}

在我的应用程序的 Controller 端是:

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult SaveDataAction(SaveDataHelper dataObject)
{
return Json(new { Success = "true" }, JsonRequestBehavior.DenyGet);
}

SaveDataHelper的定义是:

public class SaveDataHelper
{
public int MaintUserID { get; set; }
public List<DataItemHelper> ChangedFields { get; set; }
}

public class DataItemHelper
{
public string FieldName { get; set; }
public string OldValue { get; set; }
public string NewValue { get; set; }
}

闯入我的 JavaScript,在 ajax 调用时,变量 dataObject 包含以下内容:

Object {__RequestVerificationToken: "Long-string-of-characters", MaintUserId: "9", ChangedFields: Array[1]}

ChangedFields 包含以下内容:

0: Object
FieldName: "MiddleName"
NewValue: ""
OldValue: "S"

当我收到错误时,我查看控制台中的 jqXHR 并在响应文本的顶部找到它:

[HttpAntiForgeryException (0x80004005): The required anti-forgery form field &quot;__RequestVerificationToken&quot; is not present.]

此代码与我的应用程序中的所有代码类似。这里唯一的区别是我在 dataObject 中传递一个数组(这是我第一次需要这样做)。

有什么建议吗?

编辑:由于有关防伪表单的问题..我(在 Chrome 中)转到“查看页面源代码”并粘贴了其中的前几行:

<form action="/Admin/UserMaint/9" id="__AjaxAntiForgeryForm" method="post"><input name="__RequestVerificationToken" type="hidden" value="long-string-of-charaacters-here" /></form><!DOCTYPE html>
<html>
<head>

所以 __AjaxAntiForgeryForm 是我页面上的第一件事......甚至在 html 标签之前。

这是我的 View 的创建部分:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
@Html.AntiForgeryToken()
}

-- 编辑 2014 年 12 月 10 日 @ 下午 2:31(美国东部时间)--

在查看了为此提出的一些评论(尤其是@Pointy 的评论)后,我尝试“扁平化”我的数据。我已将 dataObject 逻辑替换为以下内容:

var dataObject = {
__RequestVerificationToken: token,
UserId: '@Model.UserId',
Field1Dirty: ($('#FieldID').hasClass('DirtyField')) ? 1 : 0,
Field1Old: $('#FieldID').attr('data-oldvalue'),
Field1New: $('#FieldID').val(),
-- etc --
};

但是,即使使用完全平坦的数据,我仍然看到数据作为请求有效负载传递,并且在 Controller 中仍然没有得到任何内容。

-- 编辑 2014 年 12 月 10 日 @ 下午 3:23(美国东部时间)--

好吧..现在我完全迷路了。我将代码编辑为:

var dataObject = {
UserId: '9'
};

它仍然作为请求负载发送。我不知道下一步该尝试什么。

最佳答案

您的传出 $.ajax() 调用使用 contentType 属性进行编码。这会影响请求的内容类型,而不是响应的内容类型。

我没有在 jQuery 源代码中找到它在何处以及如何影响发出的 HTTP 请求。

关于javascript - ValidateAntiForgeryToken 由于 AJAX 调用而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com