ASP MVC4 - 通过视图模型查看通过列表

use*_*778 4 c# asp.net asp.net-mvc razor asp.net-mvc-4

我有一个模范人物(其中包括出生当天的其他字段),我想将所有人的列表以及每个人的计算年龄传递给视图

为此:

  1. 视图模型

    public class vm_PersonList
    {
        public Person Person { get; set; } 
        public int age { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 风景

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

Person表包含例如6个条目.在调试应用程序时,我看到:

在控制器操作结束时,"list"正确包含6个不同的Person条目

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

Dar*_*rov 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);
}
Run Code Online (Sandbox Code Playgroud)