c# - 将复杂类型属性绑定到主要类型
问题描述
假设我在 .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 之前复制字段在这种情况下也不适合,因为如果请求失败,我会要求旧模型将其传递给具有模型错误的视图
解决方案
如果您需要不同的数据结构,则需要不同的类。这很常见。所以问题似乎更多是关于如何将结构 A 映射到结构 B。
有多种选择:
- automapper 之类的库:https ://automapper.org/
- 编写自己的代码
对于 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));
}
使用构造函数设置所有数据的一个很好的效果是,如果您修改模型,编译器将显示所有需要更新的地方。
推荐阅读
- discord - Discord 音乐机器人的音频崩溃
- reactjs - 'React' 已声明,但它的值从未在 ts 4.2 中读取
- dataset - 寻找特定的幸福数据集
- reactjs - React tsconfig-paths 找不到模块
- ruby-on-rails - 使用 React 和 Rails 后端创建评论
- java - onActivityResult 没有通过 requestCode
- jdbc - 防止 WildFly 过早解除绑定数据源
- css - 用于循环文本的 CSS 关键帧
- wordpress - 将 URL 保存到重力表单项列表
- php - 如何在 sprintf PHP 中添加逗号分隔?