2016-10-23 10 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();

Причина заключается в том, что вы хотите новую модель представления для каждого клиента, но вместо того, чтобы вы в настоящее время создает только один вид модели и изменяя его свойства. Когда вы добавляете его в список, вы не добавляете копию; вы добавляете ту же модель просмотра, которую вы уже добавили.

Этот код будет работать, если DimCustomersIndexViewModel был структурой, потому что структуры - это всего лишь мешок ценностей, которые не имеют неотъемлемой идентичности, и они копируются, а не ссылаются. (Technical comparison.) Но это класс (как и должно быть), с уникальным идентификатором, поэтому вы добавляете ссылку в единую модель просмотра в список снова и снова. Customerlist[0] и CustomerList[1], а все остальные пункты указывают на тот же экземпляр объекта DimCustomersIndexViewModel, свойства которого затем перезаписаны и оставлены равными самому последнему клиенту.

Перемещая эту линию внутри цикла, вы создаете отдельный DimCustomersIndexViewModel для каждого клиента, каждый со своим собственным набором свойств, и CustomerList содержит ссылки на множество различных экземпляров DimCustomersIndexViewModel объектов.


После того, как у вас есть солидный опыт работы с этой концепцией, будущий шаг мог бы использовать AutoMapper, так что вы не должны поддерживать список всех свойств в коде здесь.

1

Проблема заключается в том, что вы добавили то же эталонный объект во время каждой итерации вашего цикла. Этот объект никогда не изменяется (вы никогда не возвращаете new), но вы изменяете свойства объекта. Затем вы добавляете этот объект снова и снова. Вам нужно обновить этот объект каждую итерацию цикла.

+0

Спасибо, это была проблема, удивительно, как я пропустил простой материал :) – mbdevlists