2016-10-23 5 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 => 새로운 DimCustomersIndexViewModel {Title = x.Title, FirstName = x.FirstName, ......} .ToList();' –

답변

3

이 라인은 루프 내에서 할 필요가 :

DimCustomersIndexViewModel CustomerItem = new DimCustomersIndexViewModel();

이유는 각 고객을위한 새로운 뷰 모델을 원하는,하지만 대신 현재 하나의 뷰 모델을 생성하고, 속성을 변경합니다. 목록에 추가하면 사본을 추가하지 않습니다. 이미 추가 한 동일한 뷰 모델을 추가하고 있습니다.

구조체가 고유 한 ID가없는 값의 봉지이며 참조되지 않고 복사되기 때문에 DimCustomersIndexViewModel이 구조체 인 경우이 코드가 작동합니다. (Technical comparison.)하지만 고유 한 ID를 가진 클래스이기 때문에 참조을 단일 뷰 모델에 반복하여 목록에 추가합니다. Customerlist[0] 및 이고 다른 모든 항목은 동일한 DimCustomersIndexViewModel 개체 인스턴스를 가리키고 속성은 덮어 쓰여지고 마지막 고객과 동일하게 유지됩니다. 내부의 루프를이 줄 를 이동하여

, 당신은 속성의 자신의 세트로 각 고객에 대해 별도의 DimCustomersIndexViewModel 각을 작성하고, CustomerList는 다양한 DimCustomersIndexViewModel 객체 인스턴스에 대한 참조를 포함합니다.

이 개념에 대한 경험이 있으면 나중에 코드에서 모든 속성 목록을 유지 관리 할 필요가 없도록 AutoMapper을 사용하는 것이 좋습니다.

1

루프를 반복 할 때마다 동일한 참조 개체를 추가하는 것이 문제입니다. 그 객체는 절대로 바뀌지 않지만 (결코 다시는 new), 객체의 속성을 변경합니다. 그런 다음 그 객체를 계속 추가합니다. 루프의 반복마다 해당 객체를 새로 작성해야합니다.

+0

고마워, 그게 문제 였어. – mbdevlists