我有两个视图模型。一个显示员工信息,另一个显示添加到员工的任何紧急联系人的信息(一对多)。
我设法将它们的信息分开显示,但由于某些原因,当我试图将它们组合到一个视图中时,事情就出错了。
起初,我认为在一个视图中包含所有这些信息的最好方法是只创建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);
}
发布于 2018-10-26 05:37:03
所以,答案很简单。正如斯蒂芬在上面提到的,我所要做的就是返回一个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
此外,值得注意的是,我曾尝试重复相同的步骤,但这一次使用这个问题标题中提到的实际ViewModels,但到目前为止都失败了。
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();
}
https://stackoverflow.com/questions/52998032
复制相似问题