将复杂类型 属性 绑定到主要类型
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;}
...
}
如何使用 MyClass 的 Name 属性 将 List<MyClass>
绑定到 List<string>
注意 - 1) 我觉得在客户端或 api 中使用重复的 属性 不是一个好的解决方案
2) 在这种情况下,使用 List<string>
作为 属性 类型的不同 ViewModel 并将 POSTing 之前的字段复制到 api 也不合适,因为如果请求失败,我会要求旧模型将其传递给模型错误的视图
如果您需要不同的数据结构,您将需要不同的 classes。这很常见。所以问题似乎更多是关于如何将结构A映射到结构B。
有多个选项:
- automapper 之类的库:https://automapper.org/
- 编写自己的代码
对于 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));
}
使用构造函数设置所有数据的一个好处是,如果您修改模型,编译器将向您显示所有需要更新的地方。
假设我在 .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) 在这种情况下,使用 List<string>
作为 属性 类型的不同 ViewModel 并将 POSTing 之前的字段复制到 api 也不合适,因为如果请求失败,我会要求旧模型将其传递给模型错误的视图
如果您需要不同的数据结构,您将需要不同的 classes。这很常见。所以问题似乎更多是关于如何将结构A映射到结构B。
有多个选项:
- automapper 之类的库:https://automapper.org/
- 编写自己的代码
对于 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));
}
使用构造函数设置所有数据的一个好处是,如果您修改模型,编译器将向您显示所有需要更新的地方。