C# .NET Core 3 Web API:[FromBody]如何绑定抽象类属性

C# .NET Core 3 Web API:[FromBody]如何绑定抽象类属性,c#,.net,asp.net-core,asp.net-core-webapi,asp.net-core-3.1,C#,.net,Asp.net Core,Asp.net Core Webapi,Asp.net Core 3.1,我有API模型请求的类层次结构: public class Human { public string Name { get; set; } public byte Age { get; set; } public IEnumerable<HumanData> Data { get; set; } } public abstract class HumanData { public Guid Id { get; set; } public

我有API模型请求的类层次结构:

public class Human
{
    public string Name { get; set; }
    public byte Age { get; set; }
    public IEnumerable<HumanData> Data { get;  set; }
}

public abstract class HumanData
{
    public Guid Id { get; set; }
    public string Text { get; set; }
    public virtual string Type => GetType().Name;
}

public class HealthData : HumanData
{
    public byte Weight { get; set; }
    public byte Growth { get; set; }
    public string Pressure { get; set; }
}

public class AddressData : HumanData
{
    public string City { get; set; }
    public string Street { get; set; }
    public uint House { get; set; }
    public uint Apartment { get; set; }
}

但是请求模型没有拉入
humanRequest
变量。原因在
Data
字段
HumanData
类层次结构中。如何制作这样的绑定?

如果您像这样更改动作签名,那么获得模型的唯一方法是

[HttpPost]
    public async Task<IActionResult> Add([FromBody] JObject humanRequest)
    {

        //Functionality
    }
but you will have untyped Object in this case and you have to read it like this:
var name=humanRequest["Name"].ToString();
{
Id: "0f8fad5b-d9cb-469f-a165-70867728950e"
"Name":"Alex",
"Age":30,
AddressId="0f8fad5b-d9cb-469f-a165-70867728950e",
HealthId="0f8fad5b-d9cb-469f-a165-70867728950d",
"Address":{
    "Id": "0f8fad5b-d9cb-469f-a165-70867728950e",
    "Text":"Residence address",
    "City":"Elblag",
    "Street":"1 maja",
    "House":"95",
    "Type":"AddressData"
},
"Health":{
    "Id": "0f8fad5b-d9cb-469f-a165-70867728950d",
    "Text":"Residence address",
    "Weight":"75",
    "Growth":"179",
    "Pressure":"120/85",
    "Type":"HealthData"
}
}
您的Json模型应该如下所示

[HttpPost]
    public async Task<IActionResult> Add([FromBody] JObject humanRequest)
    {

        //Functionality
    }
but you will have untyped Object in this case and you have to read it like this:
var name=humanRequest["Name"].ToString();
{
Id: "0f8fad5b-d9cb-469f-a165-70867728950e"
"Name":"Alex",
"Age":30,
AddressId="0f8fad5b-d9cb-469f-a165-70867728950e",
HealthId="0f8fad5b-d9cb-469f-a165-70867728950d",
"Address":{
    "Id": "0f8fad5b-d9cb-469f-a165-70867728950e",
    "Text":"Residence address",
    "City":"Elblag",
    "Street":"1 maja",
    "House":"95",
    "Type":"AddressData"
},
"Health":{
    "Id": "0f8fad5b-d9cb-469f-a165-70867728950d",
    "Text":"Residence address",
    "Weight":"75",
    "Growth":"179",
    "Pressure":"120/85",
    "Type":"HealthData"
}
}

但老实说,我不明白你为什么需要3张桌子放人。在大多数情况下,您将拥有一对一的关系。我想在1中合并所有这3个表。

您使用的是哪个JSON序列化器?我使用的是NeNoToStutJSON。
{
Id: "0f8fad5b-d9cb-469f-a165-70867728950e"
"Name":"Alex",
"Age":30,
AddressId="0f8fad5b-d9cb-469f-a165-70867728950e",
HealthId="0f8fad5b-d9cb-469f-a165-70867728950d",
"Address":{
    "Id": "0f8fad5b-d9cb-469f-a165-70867728950e",
    "Text":"Residence address",
    "City":"Elblag",
    "Street":"1 maja",
    "House":"95",
    "Type":"AddressData"
},
"Health":{
    "Id": "0f8fad5b-d9cb-469f-a165-70867728950d",
    "Text":"Residence address",
    "Weight":"75",
    "Growth":"179",
    "Pressure":"120/85",
    "Type":"HealthData"
}
}