2016-10-23 1 views
1

Je suis nouveau à l'utilisation de ViewModels, j'ai une nouvelle liste ici et j'ajoute des éléments en bouclant si une table de base de données. Le problème est que tous les enregistrements qui reviennent sont identiques en utilisant le même enregistrement encore et encore. Quel pourrait être le problème et est-ce un bon moyen de remplir les données et de passer un ViewModel ou y a-t-il un meilleur moyen? À l'heure actuelle, il renvoie environ 500 enregistrements avec les mêmes données.ViewModel renvoie les mêmes valeurs pour tous les enregistrements 500+ à la vue

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

En plus d'initialiser le modèle de vue à l'intérieur de la boucle selon les réponses, vous pouvez également utiliser 'var CustomerList = db.DimCustomers.Select (x => nouveau DimCustomersIndexViewModel {Title = x.Title, FirstName = x.FirstName, ......} .ToList(); ' –

Répondre

3

Cette ligne doit être dans la boucle:

DimCustomersIndexViewModel CustomerItem = new DimCustomersIndexViewModel();

La raison est que vous voulez un nouveau modèle de vue pour chaque client, mais vous créez actuellement un seul modèle de vue et changer ses propriétés. Lorsque vous l'ajoutez à la liste, vous n'en ajoutez pas de copie. vous ajoutez le même modèle de vue que vous avez déjà ajouté.

Ce code fonctionnerait si DimCustomersIndexViewModel était une structure, car les structures ne sont qu'un ensemble de valeurs qui n'ont aucune identité propre et qui sont copiées plutôt que référencées. (Technical comparison.) Mais c'est une classe (comme il se doit), avec une identité unique, donc vous ajoutez une référence au modèle de vue unique dans la liste encore et encore. Customerlist[0] et CustomerList[1] et tous les autres éléments pointent vers la même instance d'objet DimCustomersIndexViewModel, dont les propriétés sont ensuite remplacées et laissées égales au tout dernier client.

En déplaçant cette ligne à l'intérieur la boucle, vous créez un DimCustomersIndexViewModel séparé pour chaque client, chacun avec son propre ensemble de propriétés et CustomerList contient des références à plusieurs instances d'objet DimCustomersIndexViewModel.


Une fois que vous avez une solide expérience avec ce concept, une étape future pourrait être d'utiliser AutoMapper afin que vous n'avez pas de maintenir une liste de toutes les propriétés dans votre code ici.

1

Le problème est que vous ajoutez le même objet de référence lors de chaque itération de votre boucle. Cet objet ne change jamais (vous ne l'avez plus jamais), mais vous changez les propriétés de l'objet. Ensuite, vous ajoutez cet objet encore et encore. Vous devez renouveler cet objet à chaque itération de la boucle.

+0

Merci, c'était le problème, incroyable comment j'ai raté les choses simples :) – mbdevlists