两个ViewModel元组

时间:2018-10-25 21:00:15

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我有两个视图模型。一个显示雇员信息,另一个显示有关添加到该雇员(一对多)的任何紧急联系人的信息。

我正在设法分别显示它们的信息,但是由于某种原因,当我尝试将它们合并为一种视图时,出现了问题。

起初,我认为将所有这些信息包含在一个视图中的最佳方法是仅创建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);
    }

1 个答案:

答案 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();
    }