3

我刚刚开始使用 MVC,并且正在开发我的第一个项目。我一直在试图解决我的视图模型和域对象的问题。

我的视图模型由一个客户对象和一个地址对象组成。问题是,即使客户和地址的所有属性都显示在视图上,如果我在视图模型中明确定义每个属性,我只能保存更改。换句话说,我需要在视图模型中复制客户和地址对象的属性。这解决了我所有的问题。

我的问题是,我是否需要在视图模型中显式定义每个属性,还是有一种方法可以使用 Customer 类型的 Customer 属性和 Address 类型的 Address 属性定义视图模型(这会更简单)?

根据我在网上找到的内容,我认为答案是我必须在视图模型中定义每个属性。如果这是正确的,有没有办法自动为我做这个映射?

ASP.NET MVC 4

4

2 回答 2

1

AutoMapper在制图方面非常流行。

关于您的 ViewModel 定义,您希望您的 ViewModel 直接对应于您的 View。您的 ViewModel 中不应有未在 View 上使用的属性。如果您有无逻辑视图(您应该这样做!),那么通常您的 ViewModel 上的属性将直接与您在您的视图上的字段相关。

当然,有时两个 ViewModel 会使用完全相同的属性,并且没有什么可以阻止您执行以下操作:

public class CustomerViewModel {
    public string Name { get; set; }
    public AddressViewModel Address { get; set; }
}

public class AddressViewModel {
    public string AddressLine1 { get; set; }
}

问题是,一旦你开始这样做,很容易让自己滑入一个没有在某处使用过一次或两次的属性,可能会引入一些 ViewModel 继承,最终得到非常混乱的 ViewModel。

一般来说,我发现建议使用平面 ViewModels。例如,如果您有两个需要客户和地址信息的视图,只需点击一下,为这两个视图创建一个单独的 ViewModel 并复制它们的属性。

于 2012-07-17T03:33:40.777 回答
1

在. _ _ ViewModel您的 ViewModel 可能看起来与您的域模型相似。但是您的视图模型只需要视图所需的属性。不是所有的属性。

例如:您可能有一个带有属性的客户域模型CustomerID, FirstName,LastName,CreatedDate,CreatedBy,LastModifiedDate

public class CustomerDomainModel
{
  public int CustomerID { set;get;}
  public string FirstName { set;get;}
  public string LastName { set;get;}
  public DateTime CreatedDate { set;get;}
  public DateTime LastModifiedDate { set;get;}
  public int  CreatedBy { set;get;}
}

但是在您的视图中(UI 表单),您可能需要仅显示 和 的FirstName字段LastName。所以你的 viewModel 可能只有这 3 个属性(名字和姓氏 + 另一个属性CustomerID也有)

public class CustomerViewModel
{
  //My view is going to use only these 3 fields.
  // Hence no other properties i am defining here
  public int CustomerID { set;get;}
  public string FirstName { set;get;}
  public string LastName { set;get;} 
}

要在这 2 个(域对象到 ViewModel)之间进行映射,您可以考虑使用Automapper

于 2012-07-17T03:42:58.527 回答