ASP MVC4 - 通过视图模型将列表传递到视图

4
我有一个人员模型(包含出生日期等字段),我想将每个人的信息列表以及他们的年龄一起传递到视图。
因此,需要执行以下操作:
  1. The view model

    public class vm_PersonList
    {
        public Person Person { get; set; } 
        public int age { get; set; }
    }
    
  2. The controller action:

    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. The view

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

Person表格包含6个条目。

当调试应用程序时,我看到:

在控制器操作的末尾,“list”正确包含6个不同的Person条目

在视图中,“Model”包含6个条目,但是最后一个“数据库条目”出现了6次。有人有解决此问题的建议吗?


将变量list_p = new vm_PersonList()移动到foreach循环中。 - Chris
3个回答

7
您在循环内部一遍又一遍地使用同一个“list_p”实例。因此,您不断更新其“Person”属性。由于“Person”是引用类型,您在修改内存中的同一引用。在循环的最后一次迭代中,您显然将此引用替换为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);
}

1

您正在处理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);
}

0

这是与您的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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接