【问题标题】:Two ViewModel Tuple两个 ViewModel 元组
【发布时间】:2019-03-30 13:59:31
【问题描述】:

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

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

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

控制器动作:组合视图

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);
    }

【问题讨论】:

  • 您应该返回CombinedView 的实例(并在您的视图中使用循环来显示EmergencyContactsList

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


【解决方案1】:

是的,答案很简单。正如斯蒂芬上面提到的,我所要做的就是返回一个 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();
    }

另外,在组合视图中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2012-03-23
    • 2017-05-28
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多