c# - ViewModel 最终成为 Model 的副本 - 好处在哪里?

标签 c# asp.net-mvc asp.net-mvc-4 viewmodel

我在这里问的另一个问题为我打开了一 jar 蠕虫。目前我正在开发我的 MVC 应用程序,模型代表我的数据并使用脚手架从这些模型生成我的 ViewControllers。在模型中没有所需信息的地方,我使用部分 View 来显示相关信息。经过一些阅读,我现在明白 ViewModel 是更好的做事方式。所以我的理解是,对于每个 View ,我都会有一个特定的 ViewModel 来返回该 View 的数据。

我有两个模型,一个代表一个项目,另一个代表可能有多个项目选项。

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 将只包含我在 View 中向用户显示的信息:
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 的好处。我读过它是为了我们可以将所有数据放在一个与该 View 相关的类中,因此我们可以保持 View 的强类型。然而,我似乎只是将我的模型复制到我的 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));

如果我这样做,它如何为编辑 View 工作。如果我将它们保存回 ItemDetailViewModel 会更新我在 EF 中的数据库吗?

最佳答案

当有好处时使用 View 模型。如果您的领域模型已经与您的 View 模型具有完全相同的属性和验证规则以及与此特定 View 对应的错误消息,那么很明显您可以重用您的领域模型并且您不需要声明 View 模型。但根据我的经验,这种情况很少发生。或者,如果是这种情况,那么您可能会开始问自己为什么域模型与 View 如此耦合。我的意思是特定于 View 的错误消息不应该是域模型的一部分。

所以和往常一样,你应该找到正确的平衡点。拥有一个聚合(作为属性)一个或多个域模型的主 View 模型是很常见的。

作为 AutoMapper 配置中的旁注,如果每个属性具有相同的名称,则不需要映射每个属性。这就是该框架被称为 AutoMapper 的原因,因为它按惯例工作。您的问题中显示的所有这些长映射代码等效于更简单的 Mapper.CreateMap<Item, ItemDetailViewModel>(); .

关于c# - ViewModel 最终成为 Model 的副本 - 好处在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20828315/

相关文章:

c# - 将 Nullable 转换为 ValueType

javascript - 从 C# 中的 jquery bootgrid 获取排序方向

asp.net-mvc - MVC - InvalidOperationException : UserId not found

c# - 在 ASP .NET MVC 4 中运行 Owin 应用程序

c# - ORA-12545 : Connect failed because target host or object does not exist - No error on System. Data.OracleClient

c# - 如何防止 SignOutResult 导致重定向循环?

c# - 找不到与请求 URI 'Myurl' 匹配的 HTTP 资源 在 Controller 'controllername' 上找不到与请求匹配的操作

asp.net-mvc - 使用 ASP.NET MVC 查询字符串中的身份验证 token 对用户进行身份验证

c# - 在为图像处理项目选择 C# 和 C++ 时,我应该考虑哪些因素?

c# - Asp.net core 2.0 Angular 模板 : add identity and authentication