ASP MVC4 – 通过视图模型查看通过列表
我有一个模范人物(其中包括出生当天的其他字段),我想将所有人的列表以及每个人的计算年龄传递给视图
为此:
-
视图模型
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(); 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 @foreach (var p in Model) {
@p.Person.FullName @p.age
Person表包含例如6个条目。 调试应用程序时,我看到:
在控制器操作结束时,“list”正确包含6个不同的Person条目
在视图中,“模型”包含6个条目,但是最后一个“数据库条目”的6倍。 有没有人有解决这个问题的建议?
您在循环内list_p
使用相同的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); }
您正在处理相同的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); }
这与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); }