4 Stimmen

ASP MVC4 - Übergabe der Liste an die Ansicht über das Ansichtsmodell

Ich habe ein Modell Person (mit u.a. dem Tag der Geburt) und ich möchte eine Liste aller Personen, zusammen mit dem berechneten Alter jeder Person, an die Ansicht

Deshalb:

  1. Das Ansichtsmodell

    public class vm_PersonList
    {
        public Person Person { get; set; } 
        public int age { get; set; }
    }
  2. Die Aktion des Controllers:

    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. Die Aussicht

    @model List<programname.Viewmodels.vm_PersonList>
    
    @foreach (var p in Model)
    {
        <tr>
            <td>
                @p.Person.FullName
            </td>
            <td>
                @p.age
            </td>  
        </tr>
    }

Die Tabelle Person enthält zum Beispiel 6 Einträge. Bei der Fehlersuche in der Anwendung sehe ich:

Am Ende der Controller-Aktion enthält "list" korrekt die 6 verschiedenen Personeneinträge

In der Ansicht enthält das "Modell" 6 Einträge, aber 6 Mal den letzten "Datenbankeintrag". Hat jemand einen Vorschlag zur Lösung dieses Problems?

7voto

Darin Dimitrov Punkte 990883

Sie verwenden dieselbe list_p Instanz immer wieder innerhalb der Schleife. Sie aktualisieren also ständig die Eigenschaft Person. Und da Person ein Verweistyp ist, ändern Sie denselben Verweis im Speicher. Bei der letzten Iteration der Schleife ersetzen Sie offensichtlich diesen Verweis durch die letzte Instanz von Person, was erklärt, warum Sie dieselbe Person in der Ansicht sehen.

Versuchen Sie es so, es scheint viel einfacher zu sein:

public ActionResult PersonList()
{
    ViewBag.Message = "My List";
    var model = db.Person.Select(p => new vm_PersonList
    {
        Person = p,
        age = 23
    }).ToList();
    return View(model);
}

1voto

terjetyl Punkte 9247

Sie arbeiten an der gleichen Instanz von vm_PersonList. Verschieben Sie die Instanziierung von vm_PersonList in die Schleife

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

0voto

mattytommo Punkte 54775

Es ist ein Problem mit dem Umfang Ihrer list_p Instanz. Versuchen Sie, Ihren Controller-Code zu ändern:

public ActionResult PersonList()
{
    ViewBag.Message = "My List";

    var list = db.Person
        .Select(p => new vm_PersonList
                     {
                         Person = p,
                         age = 23,
                     })
        .ToList();

    return View(list);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X