Web.Api不反序列化Post中Child Array的属性

时间:2015-02-11 21:47:15

标签: asp.net asp.net-web-api http-post asp.net-core

我有一个在浏览器中从json正确反序列化的复杂对象,但是当我用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]属性,当我得到null结果时。)

[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#Documents实例中的值是什么

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&#39; $ http.post($http.post('http://localhost:11786/api/documents/', res.data);)并将[FromBody]属性添加到method参数,我会得到正确的结果。看起来我在$ .ajax中传递数据的方式不正确,即使我尝试了上述四种方法。

2 个答案:

答案 0 :(得分:3)

contentType添加到您的ajax设置对象,JSON.stringify您的doc对象,将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);
})

它应该有用。

答案 1 :(得分:1)

看起来你遇到了一个已知的问题,即模型绑定不支持绑定到JQuery formurlencoded数组格式。以下问题是跟踪它。

https://github.com/aspnet/Mvc/issues/211

好奇,是不是故意你没有设置[FromBody] ..我的问题是为什么当你使用ajax调用时为什么不以json格式发送数据...是否要避免使用CORS - 飞行请求?