2012-05-25 88 views
4

我有一个模型人(除了其他领域的出生日) ,我想通过一个所有人的名单,连同每个人的计算年龄,以视图ASP MVC4 - 通过列表通过查看模型查看

THEREFOR:

  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次最后“数据库条目”。 有没有人有解决这个问题的建议?

+0

move var list_p = new vm_PersonList();进入foreach循环。 – Chris

回答

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