我为我的一个通过AJAX调用处理表单数据的控制器滚动自己的ValidateAntiForgeryToken
Web API 2.2属性。
我将数据作为JSON发送到我的控制器,它看起来像这样(来自Fiddler):
{"__RequestVerificationToken":"E8EoBCaFbqSOXhQZiuM93jciTcOAYeLjZj682-3SZRaQ6OOtrm-caZI_IWnX1FH_nwe_AuWnWwxy5ulS0Ynz0STlNptqN09Lu69HxyTeA9PUln8h73yjahB24QPxqI010","ProjectInfo.Description":"Test Description 2"}
我试图获取这样的__RequestVerificationToken
数据,但它不起作用:
JToken json = (JToken)actionContext.ActionArguments["json"];
formToken = (string)json["__RequestVerificationToken"];
formToken
保持包含空值,因此通过一些调试我发现整个JSON值被视为一个Key,其值为空值,如下面的屏幕截图所示:
我不确定为什么会这样,因为JSON似乎有效。 Fiddler能够解析JSON而不会出现JSON Viewer中内置的问题,但是JSON.NET似乎将整个json字符串作为Key而不是解析它。我知道我可以破解它并手动从密钥中解析出我需要的值,但这很脏,因为我宁愿这样做。
我使用JSON或方法来获取它有什么问题,或者json.net库/ asp.net中是否存在导致此行为的错误?知道为什么会这样吗?
修改
可能以某种方式将数据序列化两次,但我不确定为什么/如何。从我的调试器这里得到json
的字符串化值:
Root = {
"{\"__RequestVerificationToken\":\"yqob-3bUW8C8sUrHWu_feRFOz2KPUKqugo1QoN2s8v9UhlMTwSonxoEdnh85TdM56Xj-aixZdgSQXs8D6ureAQTU83wVtvsoLBd2tDl0ZPyq_2sFefObQx0VHOExQjgh0\",\"ProjectInfo.Description\":\"Test Description\"}": ""
}
这是在客户端生成JSON的代码。它是一个jQuery扩展:
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray();
$.each(a, function () {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
}
else {
o[this.name] = this.value || '';
}
});
return o;
};
然后在提交方法中调用它:
$('#description-editable form').submit(function (e) {
e.preventDefault();
var data = JSON.stringify($(this).serializeObject());
//ajax method for PUT here...
});
答案 0 :(得分:1)
这取决于你的AJAX选项是什么,但看起来你的对象在被发送之前被字符串化了两次。您应该可以删除stringify
来电:
$('#description-editable form').submit(function (e) {
e.preventDefault();
var data = $(this).serializeObject();
//ajax method for PUT here...
});