我有两个视图模型。一个显示雇员信息,另一个显示有关添加到该雇员(一对多)的任何紧急联系人的信息。
我正在设法分别显示它们的信息,但是由于某种原因,当我尝试将它们合并为一种视图时,出现了问题。
起初,我认为将所有这些信息包含在一个视图中的最佳方法是仅创建1个ViewModel并添加所有必填字段。但是,当我添加了紧急联系字段时,它们是关系的“很多”部分,我不确定如何在相同的返回模型(一对多)中遍历它们。因此,我尝试尝试使用Tuple <>创建组合视图。可悲的是,这也不是很顺利。任何帮助表示赞赏。
模型类:PersonInfoViewModel
public class PersonInfoViewModel
{
public int PersonId { get; set; }
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Surname")]
public string LastName { get; set; }
}
模型类:EmergencyContactViewModel
public class EmergencyContactViewModel
{
public int EmergencyContactId { get; set; }
[Display(Name = "First Name")]
public string EmergencyContactFirstName { get; set; }
[Display(Name = "Surname")]
public string EmergencyContactLastName { get; set; }
}
模型类:CombinedView
public class CombinedView
{
public Person PersonC { get; set; }
public List<EmergencyContact> EmergencyContactsList { get; set; }
}
控制器操作:CombinedView
public ActionResult CombinedView(int id)
{
var person = _context.People.Find(id);
ViewBag.PersonId = _context.People.Find(id);
if (person != null)
{
List<EmergencyContactViewModel> ec = new List<EmergencyContactViewModel>(id);
PersonInfoViewModel pi = new PersonInfoViewModel();
return View(Tuple.Create(pi, ec));
}
return View();
}
控制器操作:PersonInfo
public async Task<ActionResult> PersonInfoViewModel(int? id)
{
var person = await db.People.FindAsync(id);// pull record from DB by id
if (person != null)
return View(new PersonInfoViewModel()
{
FirstName = person.FirstName,
LastName = person.LastName
});
return View();
}
控制器操作:EmergencyContactViewModel
public ActionResult EmergencyContactViewModel(int? id)
{
List<EmergencyContact> emergecyContactsList = db.EmergencyContacts.ToList();
List<EmergencyContactViewModel> personVmList = emergecyContactsList.Select(x =>
new EmergencyContactViewModel
{
EmergencyContactId = x.EmergencyContactId,
EmergencyContactLastName = x.EmergencyContactLastName,
EmergencyContactFirstName = x.EmergencyContactFirstName,
}).ToList();
return View(personVmList);
}
答案 0 :(得分:0)
是的,答案很简单。正如斯蒂芬在上面提到的,我要做的就是返回一个CombinedView的实例。如果有人像我一样被困住,这可能会帮助您:
public ActionResult CombinedView(int id)
{
var person = _context.People.Find(id);
ViewBag.PersonId = _context.People.Find(id);
if (person != null)
{
return View(new CombinedView()
{
PersonC = person,
EmergencyContactsList = new List<EmergencyContact>(person.EmergencyContacts)
});
}
return View();
}
此外,在CombinedView中:
@model [appname].Models.CombinedView
此外,值得注意的是,我尝试重复相同的步骤,但是这次使用的是问题标题中提到的实际ViewModel,但是到目前为止,它还是失败了。
public ActionResult CombinedView2(int id)
{
var person = _context.People.Find(id);
if (person != null)
{
return View(new CombinedView2()
{
PersonInfo = new PersonInfoViewModel(),
EmergencyContactList = new List<EmergencyContactViewModel>()
});
}
return View();
}