Web.Api 未反序列化 Post 中子数组的属性
Web.Api not deserializing properties of Child Array in Post
我有一个在浏览器中从 json 正确反序列化的复杂对象,但是当我 post 用 jQuery 返回相同的数据时,数组的子对象是没有反序列化 - 它们都设置为默认值。
我试过将集合类型从 List 更改为 IEnumerables,但没有任何改变。有趣的是,我返回的元素数量是正确的。
这也是一个 CORS POST,但我在其他方面没有遇到任何问题。
型号
public class Document
{
public int DocumentId { get; set; }
public DocumentType DocumentType { get; set; }
public string Name { get; set; }
public string Path { get; set; }
public IEnumerable<DocumentField> Fields { get; set; }
}
public class DocumentField
{
public int FieldId { get; set; }
public string Path { get; set; }
public IEnumerable<FieldRelationship> RelatedFields { get; set; }
}
public class FieldRelationship
{
public int RelationshipId { get; set; }
public int FieldId { get; set; }
}
这是我的控制器方法签名(注意我的参数没有 [FromBody]
属性,当我这样做时我得到了一个空结果)。
[HttpPost]
public void Post(Web.Document webDoc)
jQuery
var res = $.get('http://localhost:11786/api/documents/1');
res.then(function (data) {
$.ajax({
type: 'POST',
url: 'http://localhost:11786/api/documents/',
crossDomain: true,
data: data,
success: function (responseData, textStatus, jqXHR) {
console.log('yes');
},
error: function (responseData, textStatus, errorThrown) {
console.log('failed');
}
});
});
响应正文的样子:
Fields[0][FieldId]=1410
&Fields[0][Path]=TestField
&Fields[0][RelatedFields][0][RelationshipId]=1
&Fields[0][RelatedFields][0][FieldId]=503
&Fields[0][RelatedFields][1][FieldId]=501
&Fields[1][Path]=cookies
&DocumentId=1
&DocumentType=2
&Name=Test Document
&Path=test.docx
生成的 C# 文档实例中的值是什么
DocumentId: 1
DocumentType: 2
Name: "Test Document"
Path: "test.docx"
Fields: [{
FieldId: 0, <--- Bad
Path: null, <--- Bad
RelatedFields: null, <--- Bad
}, {
FieldId: 0, <--- Bad
Path: null, <--- Bad
RelatedFields: null
}]
编辑
以下是我更改 ajax 调用中发送数据的方式后的结果。请记住数据是保存 get 结果的变量。
ajax.data [FromBody] Result
--------- ---------- ------
data false Props set, array count correct, array object props null
JSON.stringfy(data) false Object not null, but props null
{ "": data } false Object not null, but props null
"=" + JSON.stringfy false Object not null, but props null
data true null
JSON.stringfy(data) true null
{ "": data } true null
"=" + JSON.stringfy true null
如果我使用 angular 的 $http.post ($http.post('http://localhost:11786/api/documents/', res.data);
) 并将 [FromBody]
属性添加到方法参数,我会得到正确的结果。似乎我在 $.ajax 中传递给数据的东西是不正确的,即使我尝试了上面的四种方法。
您似乎遇到了一个已知问题,模型绑定不支持绑定到 JQuery formurlencoded 数组格式。以下问题正在跟踪它。
https://github.com/aspnet/Mvc/issues/211
好奇,你是不是故意不设置 [FromBody]
..我的问题是为什么在使用 ajax 时不以 json 格式发送数据调用...是为了避免CORS飞行前请求吗?
将 contentType
添加到您的 ajax 设置对象,将 JSON.stringify 添加到您的文档对象,将 post json 字符串添加到服务器:
var doc = { DocumentId: 1 };
var jsonDoc = JSON.stringify(doc);
jQuery.ajax('api/test', {
type: 'POST',
data: jsonDoc,
contentType: 'application/json'
})
.done(function(data, status, jqr) {
alert(status);
})
应该可以。
我有一个在浏览器中从 json 正确反序列化的复杂对象,但是当我 post 用 jQuery 返回相同的数据时,数组的子对象是没有反序列化 - 它们都设置为默认值。
我试过将集合类型从 List 更改为 IEnumerables,但没有任何改变。有趣的是,我返回的元素数量是正确的。
这也是一个 CORS POST,但我在其他方面没有遇到任何问题。
型号
public class Document
{
public int DocumentId { get; set; }
public DocumentType DocumentType { get; set; }
public string Name { get; set; }
public string Path { get; set; }
public IEnumerable<DocumentField> Fields { get; set; }
}
public class DocumentField
{
public int FieldId { get; set; }
public string Path { get; set; }
public IEnumerable<FieldRelationship> RelatedFields { get; set; }
}
public class FieldRelationship
{
public int RelationshipId { get; set; }
public int FieldId { get; set; }
}
这是我的控制器方法签名(注意我的参数没有 [FromBody]
属性,当我这样做时我得到了一个空结果)。
[HttpPost]
public void Post(Web.Document webDoc)
jQuery
var res = $.get('http://localhost:11786/api/documents/1');
res.then(function (data) {
$.ajax({
type: 'POST',
url: 'http://localhost:11786/api/documents/',
crossDomain: true,
data: data,
success: function (responseData, textStatus, jqXHR) {
console.log('yes');
},
error: function (responseData, textStatus, errorThrown) {
console.log('failed');
}
});
});
响应正文的样子:
Fields[0][FieldId]=1410
&Fields[0][Path]=TestField
&Fields[0][RelatedFields][0][RelationshipId]=1
&Fields[0][RelatedFields][0][FieldId]=503
&Fields[0][RelatedFields][1][FieldId]=501
&Fields[1][Path]=cookies
&DocumentId=1
&DocumentType=2
&Name=Test Document
&Path=test.docx
生成的 C# 文档实例中的值是什么
DocumentId: 1
DocumentType: 2
Name: "Test Document"
Path: "test.docx"
Fields: [{
FieldId: 0, <--- Bad
Path: null, <--- Bad
RelatedFields: null, <--- Bad
}, {
FieldId: 0, <--- Bad
Path: null, <--- Bad
RelatedFields: null
}]
编辑
以下是我更改 ajax 调用中发送数据的方式后的结果。请记住数据是保存 get 结果的变量。
ajax.data [FromBody] Result
--------- ---------- ------
data false Props set, array count correct, array object props null
JSON.stringfy(data) false Object not null, but props null
{ "": data } false Object not null, but props null
"=" + JSON.stringfy false Object not null, but props null
data true null
JSON.stringfy(data) true null
{ "": data } true null
"=" + JSON.stringfy true null
如果我使用 angular 的 $http.post ($http.post('http://localhost:11786/api/documents/', res.data);
) 并将 [FromBody]
属性添加到方法参数,我会得到正确的结果。似乎我在 $.ajax 中传递给数据的东西是不正确的,即使我尝试了上面的四种方法。
您似乎遇到了一个已知问题,模型绑定不支持绑定到 JQuery formurlencoded 数组格式。以下问题正在跟踪它。
https://github.com/aspnet/Mvc/issues/211
好奇,你是不是故意不设置 [FromBody]
..我的问题是为什么在使用 ajax 时不以 json 格式发送数据调用...是为了避免CORS飞行前请求吗?
将 contentType
添加到您的 ajax 设置对象,将 JSON.stringify 添加到您的文档对象,将 post json 字符串添加到服务器:
var doc = { DocumentId: 1 };
var jsonDoc = JSON.stringify(doc);
jQuery.ajax('api/test', {
type: 'POST',
data: jsonDoc,
contentType: 'application/json'
})
.done(function(data, status, jqr) {
alert(status);
})
应该可以。