我试图了解如何使用来自两个不同模型的少数属性来填充视图模型。我知道如何通过包含所有列来限制视图中的显示(即使用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?
}
谢谢!
答案 0 :(得分:2)
你几乎就在那里,只需撤回相关的Person
和Address
个实例,然后执行:
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