ASP.NET中ViewModel嵌套应使用IEnumerable<ViewModel>还是IEnumerable<Model>
ASP.NET 一对多关联场景下ViewModel选型解答
结论
方案1(为每个业务模型定义对应的ViewModel,关联属性使用对应的ViewModel类型)是符合ASP.NET开发最佳实践的选择
选型逻辑
- 符合层间隔离的设计原则:ViewModel的核心作用是隔离视图层与数据/业务层的实体模型,若在ViewModel中直接引用
Order实体,相当于把数据层的结构直接暴露给上层,后续Order实体新增敏感字段(如订单成本、内部供应商ID等)时,很容易因疏忽导致数据泄露,也可能出现非预期的字段绑定风险。 - 适配视图层的灵活需求:不同视图需要的
Order字段差异很大,当前场景仅需要Id字段,后续若有其他页面需要订单编号、下单时间、订单状态等字段时,可以针对场景定制不同的OrderViewModel,既不会携带当前场景不需要的冗余字段,也不需要修改数据层的Order实体定义。 - 规避循环引用问题:原业务实体中
Order包含Customer导航属性,Customer又包含Orders集合属性,若ViewModel直接引用Order实体,序列化返回给前端时很容易触发循环引用报错,单独定义OrderViewModel可以直接砍掉不需要的导航属性,从根源上避免这类问题。 - 保证校验规则的独立性:ViewModel通常会针对视图层的交互要求添加校验注解(如
[Required]、[Range]等),和数据层实体的业务校验规则完全独立,单独定义OrderViewModel可以针对视图需求定制校验规则,不会污染数据层实体的业务定义。
特殊场景说明
仅当项目为极简单的内部工具、无对外暴露风险,且视图需要的字段和Order实体完全匹配时,可临时使用方案2降低开发量,长期迭代的生产项目不推荐使用方案2。
内容的提问来源于stack exchange,提问作者warrior7
相关产品推荐
相关产品推荐

