首页 > 解决方案 > 将复杂类型属性绑定到主要类型

问题描述

假设我在 .net 核心客户端中有一个 ViewModel,

public class MyViewModel{
   ...
   public List<MyClass> NamesList{get;set;}
   ...
}

其中 MyClass 定义如下,

public class MyClass{
   public int Id{get;set;}
   public string Name{get;set;}
}

现在,如果我的 api 端点(POST 请求)需要如下模型,

public class MyApiModel{
   ...
   public List<string> NamesList{get;set;}
   ...
}

如何使用MyClass的Name属性List<MyClass>进行绑定List<string>

注意 - 1)我觉得在客户端或 api 中使用重复属性不是一个好的解决方案 2)使用不同的 ViewModelList<string>作为属性类型并在 POST 到 api 之前复制字段在这种情况下也不适合,因为如果请求失败,我会要求旧模型将其传递给具有模型错误的视图

标签: c#json.net-5

解决方案


如果您需要不同的数据结构,则需要不同的类。这很常见。所以问题似乎更多是关于如何将结构 A 映射到结构 B。

有多种选择:

对于 DTO(例如您的 api 模型类),我将查看 C# 记录https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/records ,这些记录非常适合此类 dto。

 public record MyApiModel(List<string> Names)
 {
     public static MyApiModel From(Model model) 
         => return new(model.NamesList.Select(n => n.Name));
 }

使用构造函数设置所有数据的一个很好的效果是,如果您修改模型,编译器将显示所有需要更新的地方。


推荐阅读