这不是一个真正的问题,除非有人有任何有价值的补充。我只是经历了几个小时的痛苦,试图找出为什么我的.NET Core API路由在POST特定类时没有工作,其中一个属性属于另一个类类型。
事情是,子属性类型是一个抽象类,看起来.NET Core不支持路由。症状是将对象作为null而不是任何有意义的值。
为了更好地说明这一点:
[Produces("application/json")]
[Route("api/AbstractTest")]
public class AbstractTestController : Controller
{
[HttpPost]
public async Task<IActionResult> PostEvent([FromBody]Parent parent)
{
return Json(parent);
}
}
public class Parent
{
public Child Child {get;set;}
}
public class ConcreteChild : Child
{
public string Name {get;set;
}
public abstract class Child
{
public int Id {get;set;}
}
以下操作无效。将具有ConcreteChild的有效Parent JSON发布到http://localhost:xxxx/abstracttest将在Postman中返回 null 。简单地删除标记Child类的抽象关键字将解决此问题。
TL; DR :.NET不喜欢向其发布的抽象类,也不会返回有意义的错误消息来帮助调试
编辑:每个人都说这是设计合理的!我应该把这篇文章中的所有细节都包括在内。我省略的部分是我实际上传入一个对象作为抽象类的具体实现(在TypeScript中镜像),并且仍然使用抽象类型来解决这个问题。似乎将concreate类型传递给控制器操作,期望抽象类型不能按预期工作 - 例如能够自动转换为正确的具体类型。
正如一些评论所暗示的那样,看起来自定义绑定可能就是答案:https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-2.0