Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套JSON上的MVC4 Post为空_C#_Asp.net_Json_Asp.net Mvc - Fatal编程技术网

C# 嵌套JSON上的MVC4 Post为空

C# 嵌套JSON上的MVC4 Post为空,c#,asp.net,json,asp.net-mvc,C#,Asp.net,Json,Asp.net Mvc,我目前正在开发一个与MVC4API通信的移动应用程序。 我刚才注意到的问题是,出于某种原因,它似乎无法解析嵌套对象 例如: 我正在向url()发布以下数据: 知道MVC将尝试根据提供的模型对其进行序列化,我为请求创建了以下模型: public class PersonRequest : RequestBase { public class Field { public int fieldId { get; set; }

我目前正在开发一个与MVC4API通信的移动应用程序。 我刚才注意到的问题是,出于某种原因,它似乎无法解析嵌套对象

例如:

我正在向url()发布以下数据:

知道MVC将尝试根据提供的模型对其进行序列化,我为请求创建了以下模型:

    public class PersonRequest : RequestBase
    {
        public class Field
        {
            public int fieldId { get; set; }
            public string fieldValue { get; set; }
        }

        public class Group
        {
            public int groupId { get; set; }
        }

        public class Person
        {
            public string name { get; set; }
            public string age { get; set; }
            public string dateOfBirth { get; set; }
            public IEnumerable<Group> groups { get; set; }
        }

        public int id { get; set; }
        public IEnumerable<Field> dynamic { get; set; }
        public Person person { get; set; }
    }
以及我的实际路由方法:

[HttpPost]
public ActionResult Generate(PersonRequest request)
{
    return Json(request, JsonRequestBehavior.AllowGet);
}
然而,答复是:

{"id":610,"person":null,"dynamic":null}
在寻找一个可能的解决方案后,人们说,在这种情况下,您必须使用IEnumerable,而不是列表。可悲的是,这似乎对我不起作用


只是一些额外的信息: 我总是可以在dataobject person和dynamic上的客户端上使用JSON.stringify,并最终在后端对其进行反序列化(如本主题所示:),但对于这个问题,必须有更好的解决方法


更改:将结果json中的组更改为动态



已解决:

为什么要使用IEnumerable,查询将在最后触发, 使用列表和检查

public class PersonRequest : RequestBase
    {
        public class Field
        {
            public int fieldId { get; set; }
            public string fieldValue { get; set; }
        }

        public class Group
        {
            public int groupId { get; set; }
        }

        public class Person
        {
            public string name { get; set; }
            public string age { get; set; }
            public string dateOfBirth { get; set; }
            public List<Group> groups { get; set; }
        }

        public int id { get; set; }
        public List<Field> dynamic { get; set; }
        public Person person { get; set; }
    }
公共类PersonRequest:RequestBase
{
公共类字段
{
public int fieldId{get;set;}
公共字符串字段值{get;set;}
}
公共课组
{
public int groupId{get;set;}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共字符串年龄{get;set;}
公共字符串dateOfBirth{get;set;}
公共列表组{get;set;}
}
公共int id{get;set;}
公共列表动态{get;set;}
公众人物{get;set;}
}
已解决

似乎我的后端设置正确。修复方法是将数据发送到后端的方式

如果要向后端发送嵌套对象,则需要对其进行分析。你必须做两件事:

  • 对发送到数据的整个数据使用JSON.stringify
  • 使用适当的内容类型,例如:

    xhr.open(“POST”,url)

    setRequestHeader(“内容类型”,“应用程序/json;字符集=utf-8”)

    setRequestHeader(“hash”,params.hash)

    send(JSON.stringify(params.data))


  • 如何在生成的JSON中设置
    键?它是否来自
    RequestBase
    类?RequestBase包含一个键“hash”,这就是全部。幸运的是,我已经解决了这个问题。这是我第一个失败的场景,幸运的是我找到了解决方案:)如果你好奇的话,请检查我的其他答案。
    {"id":610,"person":null,"dynamic":null}
    
    public class PersonRequest : RequestBase
        {
            public class Field
            {
                public int fieldId { get; set; }
                public string fieldValue { get; set; }
            }
    
            public class Group
            {
                public int groupId { get; set; }
            }
    
            public class Person
            {
                public string name { get; set; }
                public string age { get; set; }
                public string dateOfBirth { get; set; }
                public List<Group> groups { get; set; }
            }
    
            public int id { get; set; }
            public List<Field> dynamic { get; set; }
            public Person person { get; set; }
        }