正确使用ViewModel进行编辑?

时间:2016-01-14 03:37:35

标签: c# asp.net-mvc

我仍然在努力学习MVC,现在我在现实世界的网站上实现它,我想出更多的问题。我目前的问题是如何使用ViewModel来获取编辑数据。

方案是我有会员页面让用户更改他们的姓名,地址,电话等。我有一个名为Person的人的基本信息和他们在地址中的地址信息。所以,我创建了一个ViewModel,基本上将它们结合起来传递给View。

据我所知,我必须创建两个表的对象,然后在发送到View之前将它们手动组合到ViewModel中。这看起来有点麻烦,我觉得他们可能是一个更好的方法来做到这一点。当我在线搜索时,我似乎找到了涵盖这一点的任何内容。我发现的一切都是一个简单的例子,有人基本上直接从表中映射ViewModel。

这是我基本上想出来的。我是走正确的道路还是有更好的方法来做到这一点?

Person currentPerson = db.Person.Find(id);
Address currentAddress = db.Address.Find(currentPerson.PID);

MemberViewModel currentUser = new MemberViewModel();
currentUser.FirstName = currentPerson.FirstName;
currentUser.LastName = currentPerson.LastName;
currentUser.MemberId = currentPerson.PID;
currentUser.Address = currentAddress.Address1;
currentUser.City = currentAddress.City;

1 个答案:

答案 0 :(得分:1)

为什么需要使用与数据库模型非常相似的ViewModel,有很多好的理由。

  1. 如果您使用实体框架,则大多数情况下业务对象来自Entity框架数据库对象。在MVC中,我们使用数据属性验证,例如必需的验证等(System.ComponentModel)。但是如果我们在Entityframework生成的类中使用这些验证,并且如果我们更改数据库并刷新类,那么这些自定义属性将会丢失。

  2. 如果您正在使用WCF或Web服务,则自定义ViewModel类的重量很轻,因为DB对象具有与其他对象的关系等内容。

  3. ViewModel类提供了组合对象和自定义字段的选项。 关于用户,一个很好的例子是用户登录。通常它涉及用户名,密码和记住我复选框。 “记住我”不是存储在db中的字段。但是要将该值从View传递给Controller,我们可以使用像LoginUserViewModel这样的对象,其中包含用户名,密码并记住我。

  4. 当然,在检索和保存数据时会涉及对象映射。 Automapper就是这个工具。