我有一个模范人物(在出生那天的其他领域) 我希望将所有人的名单连同每个人的计算年龄一起传递给视图
为此:
视图模型
public class vm_PersonList
{
public Person Person { get; set; }
public int age { get; set; }
}
控制器操作:
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);
}
视图
@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倍。 有没有人有解决这个问题的建议?
答案 0 :(得分: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 :(得分: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);
}
答案 2 :(得分: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);
}