【问题标题】:ASP MVC4 - Pass List to view via view modelASP MVC4 - 传递列表以通过视图模型查看
【发布时间】:2012-05-31 19:37:50
【问题描述】:

我有一个模型 Person(其中包括出生日期) 我想将所有人的列表以及每个人的计算年龄一起传递给视图

为此:

  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 倍。 有人有解决此问题的建议吗?

【问题讨论】:

  • 移动 var list_p = new vm_PersonList();进入 foreach 循环。

标签: c# asp.net asp.net-mvc razor asp.net-mvc-4


【解决方案1】:

您在循环中一遍又一遍地使用相同的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);
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 2021-12-03
        • 2012-01-15
        • 1970-01-01
        相关资源
        最近更新 更多