我刚刚开始使用MVC并且正在开发我的第一个项目。我一直试图用我的viewmodel和一个域对象解决问题。
我的视图模型由客户对象和地址对象组成。问题是,即使客户和地址的所有属性都显示在视图上,如果我在视图模型中明确定义了每个属性,我只能保存更改。换句话说,我需要复制客户的属性并在视图模型中寻址对象。这解决了我所有的问题。
我的问题是,我是否需要在视图模型中显式定义每个属性,或者我是否可以使用Customer类型的Customer属性和Address类型的Address属性来定义视图模型(这将是很多简单)?
根据我在网上找到的内容,我认为答案是我必须在视图模型中定义每个属性。如果这是正确的,有没有办法自动为我做这个映射?
ASP.NET MVC 4
答案 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;}
}
但是在您的视图(用户界面 - 表单)中,您可能需要仅显示FirstName
和LastName
的字段。所以你的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