我有两个模型,一个代表一个项目,另一个,项目选项可能有多个.
public class Item{ public int ItemID { get; set; } public bool Active { get; set; } public string ItemCode { get; set; } public string name { get; set; } public List<ItemOption> ItemOptions { get; set; } //...}public class ItemOption{ public int ItemOptionID { get; set; } public string name { get; set; } public string barcode { get; set; } //...}
因此,我假设我的ItemDetailviewmodel将只包含我在视图中向用户显示的信息:
public class ItemDetailviewmodel{ public bool Active { get; set; } public string ItemCode { get; set; } public string name { get; set; } public List<ItemOption> ItemOptions { get; set; }}
我应该在ItemDetailviewmodel上创建我的ItemOptions列表吗?例如它应该是:
public List<ItemOptionsviewmodel> ItemOptions { get; set; }
我想我错过了viewmodel的好处.我已经读过,因此我们可以将一个类中的所有数据都与该视图相关,因此我们可以保持视图的强类型.但是我似乎只是将我的模型复制到我的viewmodel中,所以并没有真正获得任何好处.
另外,我的研究让我想到了autoMapper是最好的前进方式.我是否正确说我只是将以下内容放入我的启动配置中:
Mapper.CreateMap<Item,ItemDetailviewmodel>() .ForMember(x => x.Active,o => o.MapFrom(s => s.Active)) .ForMember(x => x.ItemCode,o => o.MapFrom(s => s.ItemCode)) .ForMember(x => x.name,o => o.MapFrom(s => s.name)); .ForMember(x => x.ItemOptions,o => o.MapFrom(s => s.ItemOptions));
如果我这样做,它如何为编辑视图工作.如果我将它们保存回ItemDetailviewmodel,它会在EF中更新我的数据库吗?
解决方法 有利的时候使用视图模型.如果您的域模型已经具有完全相同的属性和验证规则以及与您的视图模型相对应的此特定视图的错误消息,那么很明显您可以重用域模型而不需要声明视图模型.但根据我的经验,这种情况很少发生.或者如果是这种情况,那么您可能会开始问自己为什么您的域模型如此耦合到视图.我的意思是特定于视图的错误消息不应该是域模型的一部分.所以你应该一直找到合适的平衡点.拥有主视图模型是很常见的,该模型聚合(作为属性)一个或多个域模型.
作为autoMapper配置中的旁注,如果每个属性具有相同的名称,则无需映射它们.这就是为什么框架被称为autoMapper,因为它按惯例工作.您问题中显示的所有这些长映射代码等同于更简单的Mapper.CreateMap< Item,ItemDetailviewmodel>();.
总结以上是内存溢出为你收集整理的c# – ViewModel最终成为Model的副本 – 哪里有好处?全部内容,希望文章能够帮你解决c# – ViewModel最终成为Model的副本 – 哪里有好处?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)