2016-10-23 3 views
1

私はViewModelsを初めて使用しています。ここに新しいリストがあり、データベーステーブルをループしてアイテムを追加しています。問題は、戻ってくるすべてのレコードが同じレコードを何度も使って同一であることです。何が問題になる可能性があり、これはデータを充填してViewModelを渡すための良い方法ですか、それとも良い方法ですか?現在、同じデータを持つ約500のレコードを返します。ViewModelはすべての500以上のレコードの同じ値をビューに返します

public class DimCustomersController : Controller 
{ 
    private AdventureWorks_MBDEV_DW2008Entities db = new AdventureWorks_MBDEV_DW2008Entities(); 

    public ActionResult CustomersIndexVM() 
    { 
     List<DimCustomersIndexViewModel> CustomerList = new List<DimCustomersIndexViewModel>(); 

     DimCustomersIndexViewModel CustomerItem = new DimCustomersIndexViewModel(); 
     foreach (var m in db.DimCustomers.ToList())// cold do for loop up to count 
     { 
      CustomerItem.Title = m.Title; 
      CustomerItem.FirstName = m.FirstName; 
      CustomerItem.MiddleName = m.MiddleName; 
      CustomerItem.LastName = m.LastName; 
      CustomerItem.BirthDate = m.BirthDate; 
      CustomerItem.MaritalStatus = m.MaritalStatus; 
      CustomerItem.Suffix = m.Suffix; 
      CustomerItem.Gender = m.Gender; 
      CustomerItem.EmailAddress = m.EmailAddress; 
      CustomerItem.AddressLine1 = m.AddressLine1; 
      CustomerItem.AddressLine2 = m.AddressLine2; 
      CustomerItem.Phone = m.Phone; 
      //other columns go here 
      CustomerList.Add(CustomerItem); 
     } 

     return View("CustomersIndexVM", CustomerList); 
    } 
+0

回答ごとにループ内のビューモデルを初期化する以外に、 'var CustomerList = db.DimCustomers.Select(x => new DimCustomersIndexViewModel {Title = x.Title、FirstName = x.FirstName、 ......} .ToList(); ' –

答えて

3

この行は、ループ内にする必要がある:

DimCustomersIndexViewModel CustomerItem = new DimCustomersIndexViewModel();

理由はあなたがそれぞれの顧客のための新しいビューモデルをしたいということですが、代わりにあなたが現在唯一のビューモデルを作成していると、その特性を変化させる。リストに追加すると、コピーを追加していません。すでに追加した同じビューモデルを追加しています。

このコードは、DimCustomersIndexViewModelが構造体だった場合に機能します。なぜなら、構造体は固有のIDを持たず、参照されるのではなくコピーされた単なる値のバックであるからです。 (Technical comparison.)しかし、それは一意の識別情報を持つクラスです(したがってそうでなければならないので)参照を単一のビューモデルに繰り返し追加しています。 Customerlist[0]CustomerList[1]となり、他のすべての項目は同じDimCustomersIndexViewModelオブジェクトインスタンスを指しており、そのプロパティは上書きされ、最後の顧客と等しくなります。この行に内部ループを移動させることにより

、あなたは、プロパティのそれ自身セットで各顧客ごとに個別のDimCustomersIndexViewModelを作成している、とCustomerListは、多くの異なるDimCustomersIndexViewModelオブジェクトのインスタンスへの参照が含まれています。


このコンセプトの経験があれば、今後はAutoMapperを使用してコード内のすべてのプロパティのリストを管理する必要はありません。

1

問題は、ループの繰り返しごとに同じ参照オブジェクトを追加することです。そのオブジェクトは決して変更されません(あなたは決してnewです)、オブジェクトのプロパティを変更します。その後、そのオブジェクトを何度も追加します。ループの繰り返しごとにそのオブジェクトを新しいものにする必要があります。

+0

ありがとう、それは問題だった;私は単純なものを逃した方法驚くように:) – mbdevlists

関連する問題