如何在视图模型中使用复杂对象?

时间:2012-07-17 03:27:15

标签: asp.net-mvc

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

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

我的问题是,我是否需要在视图模型中显式定义每个属性,或者我是否可以使用Customer类型的Customer属性和Address类型的Address属性来定义视图模型(这将是很多简单)?

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

ASP.NET MVC 4

2 个答案:

答案 0 :(得分:1)

AutoMapper非常适合制图。

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

当然,有时候两个ViewModel会使用完全相同的属性,并且没有什么可以阻止你做这样的事情:

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

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

问题是,一旦你开始这样做,它就更容易让你自己在一个或两次没有使用的属性中滑入,可能会抛出一些ViewModel继承而你最终会得到非常混乱的ViewModels

一般来说,我发现建议使用平面ViewModels 。例如,如果您有两个需要客户和地址信息的视图,只需获取匹配,为两个视图创建单独的ViewModel并在两个视图中复制属性。

答案 1 :(得分: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;}
}

但是在您的视图(用户界面 - 表单)中,您可能需要仅显示FirstNameLastName的字段。所以你的viewModel可能只有那3个属性(FirstName& LastName +另一个属性也有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;} 
}

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