.NET上的.NET Core 2.1抽象模型绑定

时间:2018-05-21 05:17:17

标签: c# asp.net-core .net-core

这不是一个真正的问题,除非有人有任何有价值的补充。我只是经历了几个小时的痛苦,试图找出为什么我的.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

0 个答案:

没有答案