【发布时间】:2015-05-07 13:55:46
【问题描述】:
我正在为通过 AJAX 调用处理表单数据的控制器之一为 Web API 2.2 滚动我自己的 ValidateAntiForgeryToken 属性。
我将数据作为 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 字符串作为键而不是解析它。我知道我可以破解它并从键中手动解析出我需要的值,但这很脏,因为我宁愿正确完成。
我的 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...
});
【问题讨论】:
-
JSON 有没有可能被序列化了两次?这可以解释为什么 JSON.NET 认为整个字符串是单个值而不是对象
-
@AndrewWhitaker 这绝对是可能的。从调试器中的数据看我的编辑
-
你能展示创建 JSON 的代码吗?
-
@AndrewWhitaker 你的意思是在客户端生成它的 JavaScript 吗?
-
是的。我认为您不需要在这里致电
JSON.stringify。没有它你可以试试吗?
标签: c# json json.net asp.net-web-api2 custom-attributes