ASP MVC4 - 山口列表通过视图模型查看(ASP MVC4 - Pass List to v

2019-07-29 13:37发布

我有一个模型的人(与其他领域的诞辰日之间),我想传递的所有人员的名单,与每个人的年龄计算一起,到视图

为此:

  1. 视图模型

     public class vm_PersonList { public Person Person { get; set; } public int age { get; set; } } 
  2. 该控制器操作:

     public ActionResult PersonList() { ViewBag.Message = "My List"; var list = new List<vm_PersonList>(); var list_p = new vm_PersonList(); foreach (var p in db.Person) { list_p.Person = p; //the age will be calculated based on p.birthDay, not relevant for the //current question list_p.age = 23; list.Add(list_p); } return View(list); } 
  3. 风景

     @model List<programname.Viewmodels.vm_PersonList> @foreach (var p in Model) { <tr> <td> @p.Person.FullName </td> <td> @p.age </td> </tr> } 

PERSON表例如包含6项。 当调试应用程序我看到:

在控制器动作结束“名单”中包含了正确的6名不同的人的条目

在视图中,“模型”包含6项,但最后的“数据库条目”的6倍。 有没有人有一个建议来解决这个问题?

Answer 1:

您正在使用相同的list_p遍地再比如在循环中。 所以,你在不断更新其个人财产。 而且因为Person是要修改内存中的同一个参考引用类型。 你显然与替代人的最后一个实例此参考循环的最后一次迭代这也解释了为什么你看到了同样的人的看法。

试试这个样子,似乎轻松很多:

public ActionResult PersonList()
{
    ViewBag.Message = "My List";
    var model = db.Person.Select(p => new vm_PersonList
    {
        Person = p,
        age = 23
    }).ToList();
    return View(model);
}


Answer 2:

您正在使用的vm_PersonList的同一个实例。 移动vm_PersonList的实例进入循环

foreach (var p in db.Person)
{
    var list_p = new vm_PersonList();
    list_p.Person = p;
    //the age will be calculated based on p.birthDay, not relevant for the    
    //current question
    list_p.age = 23;

    list.Add(list_p);
}


Answer 3:

这是你的范围的问题list_p实例。 试着改变你的控制器代码:

public ActionResult PersonList()
{
    ViewBag.Message = "My List";

    var list = db.Person
        .Select(p => new vm_PersonList
                     {
                         Person = p,
                         age = 23,
                     })
        .ToList();

    return View(list);
}


文章来源: ASP MVC4 - Pass List to view via view model