C# 在.NETWebAPI POST/PUT方法中使用继承类

C# 在.NETWebAPI POST/PUT方法中使用继承类,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,我不知道如何在web API控制器中使用继承的类。我必须只创建一个API控制器来创建和更新数据库中的继承对象 与我的模型类似(所有这些模型都有Dto): 我已经尝试在控制器中使用json。但是json总是null [HttpPost] public ActionResult Post([FromBody]JObject json) { // idk what's going here?! } 我的控制器现在,但这切断了狗或猫模型的所有属性 [HttpPost] public Actio

我不知道如何在web API控制器中使用继承的类。我必须只创建一个API控制器来创建和更新数据库中的继承对象

与我的模型类似(所有这些模型都有Dto):

我已经尝试在控制器中使用json。但是json总是
null

[HttpPost]
public ActionResult Post([FromBody]JObject json)
{
    // idk what's going here?!
}
我的控制器现在,但这切断了狗或猫模型的所有属性

[HttpPost]
public ActionResult Post([FromBody]AnimalDto animal)
{
    // idk what's going here?!
}
我正在使用.NETCore2.0

有什么想法吗?谢谢

编辑

如果我想动态地这样做呢?比如:

var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();
var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();
var-animal=json.ToObject();
var actualAnimal=json.ToObject();

我该怎么做?

您没有提到您正在使用.NET核心或.NET Framework,但这种行为的主要原因是模型绑定模块,它将HTTP请求中的数据映射到操作方法参数。我认为您最好开发自己的自定义模型绑定器并使用它,而不是默认的

我已经尝试在控制器中使用json。但是json总是空的

您总是得到
null
的原因是您没有声明正确的
类型。您不应该通过
[FromBody]
接收
字符串
类型的动物

[HttpPost] public ActionResult Post([FromBody]string json) public ActionResult Post([FromBody]Dog dog) { // now you get the dog } 在此场景中,动态类型为
JObject
,您可以将其强制转换为任意类型:

public IActionResult Post(/*[ModelBinder(typeof(AnimalModelBinder))]*/[FromBody] JObject json)
{
    var animal=json.ToObject<Animal>();
    var dog = json.ToObject<Dog>();
    return new JsonResult(json); 
}
[编辑]

如果我想动态地这样做呢?比如:

var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();
var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();
无论如何,您可以根据自己的需要自定义我们解析目标的方式
类型
。然后通过方法
ToObject()
将json对象强制转换为您想要的
类型

[HttpPost]
公共IActionResult帖子([FromBody]JObject json)
{
var typename=json.Value(“type”);
if(String.IsNullOrEmpty(typename))
AddModelError(“json”,“任何动物都必须提供`type`属性”);
//解析目标类型
var t=ResolveAnimalType(typename,null);
//获取`.ToObject()的方法`
MethodInfo mi=typeof(作业对象)
.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Where(m=>m.Name==“ToObject”&&m.GetParameters().Length==0&&m.IsGenericMethod)
.FirstOrDefault()
?.MakeGenericMethod(t);//ToObject()
var animal=mi?.Invoke(json,null);
返回新的JsonResult(动物);
}

请同时显示AnimalDto代码。@Dimitar之所以添加它,大概是因为您有一个约定,即
动物的
Type
属性必须是
Dog
Cat
中的一个,而且这与所使用的实际子类型相关(我假设您正在这样做),你认为一个通用JSON解析器是如何知道这一点的?我该怎么做?你能给我举一个上面代码的例子吗?(.NETCore2.0BTW)当然,你可以在这里找到一些多态模型活页夹:这很有效!但是,如果我想更动态地执行此操作,该怎么办?->请看我的edit@R.Müller我已经更新了我的答案,并创建了一个演示,以确保它能正常工作。如果你有任何问题,请随时告诉我。伙计,你是我的英雄!非常感谢你!你救了我的命我帮了很多忙!
var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();