4

私はモデルの人物(他のフィールドの中で誕生日)を持っており、すべての人物のリストを各人物の計算された年齢とともにビューに渡したい

そのため:

  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 倍です。この問題を解決するための提案はありますか?

4

3 に答える 3

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);
}
于 2012-05-25T08:06:45.757 に答える
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);
}
于 2012-05-25T08:07:58.973 に答える
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);
}
于 2012-05-25T08:10:26.610 に答える