Rap*_*ael 9 c# asp.net-core-webapi
我不知道如何在 Web API 控制器中使用继承的类。我只需创建一个API 控制器即可在数据库中创建和更新继承的对象。
与我的模型类似(所有这些模型都存在 Dto):
public class Animal
{
public virtual string Name {get; set;} // e.g. Harry
public virtual string Type {get; set;} // e.g. Dog
}
public class AnimalDto
{
public string Name;
public Type Type;
}
public class Dog : Animal
{
public virtual bool CanBark {get; set;} // e.g. true
}
public class Cat : Animal
{
public virtual bool CanMiau {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在控制器中使用 json 。但总是有 jsonnull
[HttpPost]
public ActionResult Post([FromBody]JObject json)
{
// idk what's going here?!
}
Run Code Online (Sandbox Code Playgroud)
现在是我的控制器,但这会切断狗或猫模型的所有属性
[HttpPost]
public ActionResult Post([FromBody]AnimalDto animal)
{
// idk what's going here?!
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 .NET Core 2.0
有任何想法吗?谢谢!
编辑
如果我想动态地执行此操作怎么办?就像是:
var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我已经尝试在控制器中使用 json 。但 json 总是为 null
你总是得到的原因null是你没有声明正确的Type. 您不应该string通过 接收某种动物[FromBody]。
[HttpPost]
公共 ActionResult Post([FromBody]string json)
公共 ActionResult Post([FromBody]Dog 狗)
{
// 现在你得到了狗
}
附带说明一下,如果您根本不关心类型,一种方法是声明类型dynamic:
[HttpPost]
public IActionResult Post([FromBody] dynamic json)
{
return new JsonResult(json);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,动态类型是JObject,您可以根据需要将它们转换为任何类型:
public IActionResult Post(/*[ModelBinder(typeof(AnimalModelBinder))]*/[FromBody] JObject json)
{
var animal=json.ToObject<Animal>();
var dog = json.ToObject<Dog>();
return new JsonResult(json);
}
Run Code Online (Sandbox Code Playgroud)
现在是我的控制器,但这会切断狗或猫模型的所有属性
如果您想使用AnimalDto,您应该使属性可访问:
公共类 AnimalDto
{
公共字符串名称;
公共字符串名称{get;set;}
公共字符串类型;
公共字符串类型{get;set;}
}
[编辑]
如果我想动态地执行此操作怎么办?就像是:
Run Code Online (Sandbox Code Playgroud)var animal = json.ToObject<Animal>(); var actualAnimal = json.ToObject<typeof(animal.Type)>();
如果我们想将 json 转换为某种特定类型,我们首先必须知道目标Type是什么。但您的animal.Type属性是 的一种类型String,并且可能是一个约定字符串。如果这个Type属性正是没有命名空间的类名,例如
Cat.Type必须等于CatDog.Type必须等于DogFish.Type必须等于Fish然后您可以使用它Type.GetType()来解析目标类型。例如 :
[HttpPost]
public ActionResult Post([FromBody]string json)
public ActionResult Post([FromBody]Dog dog)
{
// now you get the dog
}
不管怎样,您可以根据您自己的需求定制我们解决目标的方式Type。然后通过方法将 json 对象转换为您想要的TypeToObject<T>():
[HttpPost]
public IActionResult Post([FromBody] dynamic json)
{
return new JsonResult(json);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6801 次 |
| 最近记录: |