【问题标题】:Model bind a subset of class properties模型绑定类属性的子集
【发布时间】:2019-04-16 09:25:56
【问题描述】:

我试图从 API 请求正文中仅绑定类属性的子集,我不确定如何实现这一点。如果我可以绑定到仅具有我想接受作为输入的属性的基类,然后将其转换为具有额外属性的子类,它将解决我的问题,但不进行序列化/反序列化,这不是一个选项(即不能从基地到孩子)。示例类,我只想允许从 [FromBody] 绑定名称

public class project {
     public string id { get; set; }
     public string name { get; set; }
}

我可以在 id 上使用私有 setter,这就是答案吗?我发现当我在应用程序的其他地方设置自己的 id 时,我得到了无法访问的访问器。谢谢。

【问题讨论】:

    标签: c# asp.net-core-webapi model-binding


    【解决方案1】:

    恕我直言,您应该为要绑定的模型创建一个新的 DTO,应用 Single Responsibility Principle,并且更适合维护目的。如果您开始从基类继承,如果您需要更改该类的契约,您将面临一个巨大的问题,例如删除您不需要并且可能影响您拥有的子类的属性。

    现在你可以创建了

    class ProjectWithOnlyName
    {
        public string name{get;set;}
    }
    

    并将该实例作为控制器的参数传递

    public void MyControllerMethod([FromBody] ProjectWithOnlyName dto)
    {
        ....
    }
    

    我会为您正在执行的每个操作建议一个 DTO。

    更新

    class ProjectWithOnlyNameForUpdateDto
    {
        public string name{get;set;}
    }
    
    [HttpPut]
    public void CreateMethod([FromBody] ProjectWithOnlyNameForUpdateDto dto)
    {
        ....
    }
    

    用于创建

    class ProjectWithOnlyNameForCreateDto
    {
        public string name{get;set;}
    }
    
    [HttpPost]
    public void CreateMethod([FromBody] ProjectWithOnlyNameForCreateDto dto)
    {
        ....
    }
    

    希望对你有帮助

    【讨论】:

    • 这将解决我的问题,但它确实会导致一些对象加倍。如果我要添加参数等,这两个类都需要更新。
    【解决方案2】:

    您可以按照here 的描述使用类型转换器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多