将复杂类型 属性 绑定到主要类型

Bind a complex type property to a primary type

假设我在 .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;}
   ...
}

如何使用 MyClassName 属性 将 List<MyClass> 绑定到 List<string>

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

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

有多个选项:

对于 DTO(比如您的 api 模型 class),我会看一下 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));
 }

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