2012-05-25 3 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 различных Person записей

В мнению, «модель» содержит 6 записей, но в 6 раз последние msgstr "запись в базу данных". Есть ли у кого-нибудь предложение решить эту проблему?

+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); 
} 
Смежные вопросы