仅使用少量属性填充视图模型

时间:2014-02-11 17:50:45

标签: c# asp.net-mvc entity-framework

我试图了解如何使用来自两个不同模型的少数属性来填充视图模型。我知道如何通过包含所有列来限制视图中的显示(即使用include来连接两个模型并仅显示我需要的字段)。但我想学习如何在ViewModel中执行此操作,以便我的视图是为特定视图显示的字段。

假设我有两个模型(让我们假设一对一的关系):

public class Person
{
    public int PersonId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public class Address
{
    public int AddressId { get; set; }
    public int PersonId { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public string Country { get; set; }

让我们说在视图中我只想要LastName,FirstName和City(来自地址)。所以我将我的ViewModel编码为:

public class PersonCityViewModel
{
    public int AddressId { get; set; }
    public int PersonId { get; set; }
    public string City { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }

}

在我的视图中,我想显示名单和城市的人员列表。

我有一个PersonCityController,我在其中执行了此操作:

public ActionResult Index()
{
PersonCityViewModel vm = new PersonCityViewModel();
vm.____ = db.????

//how do I proceed?
}

谢谢!

1 个答案:

答案 0 :(得分:2)

你几乎就在那里,只需撤回相关的PersonAddress个实例,然后执行:

PersonCityViewModel vm = new PersonCityViewModel() {
  AddressId = address.AddressId,
  PersonId = person.PersonId,
  ... etc.
}

下一位完全取决于您的数据结构(例如,每个用户一个地址,可能是链接并存储在用户的Address字段中),但您可以使用LinqToSql查询执行此操作,其中psuedocode类似于:

var personQuery = (from p in myDbContext.Persons
              from a in myDbContext.Addresses
              where p.PersonId == a.PersonId
              select new {
                Person = p,
                Address = a
              };
// you should use FirstOrDefault here and check for nulls, really ...
var result = personQuery.First(r => r.Person.PersonId == personId);
PersonCityViewModel vm = new PersonCityViewModel() {
  AddressId = result.Address.AddressId,
  PersonId = result.Person.PersonId,
  ... etc.
}

如果您正在进行大量映射,请考虑使用自动对象映射器来帮助您,例如AutoMapper