ViewModel将所有500多条记录的相同值返回给视图

时间:2016-10-23 04:19:45

标签: c# asp.net-mvc viewmodel asp.net-mvc-viewmodel

我是使用ViewModels的新手,我在这里有一个新列表,并通过循环数据库表添加项目。问题是,所有返回的记录都是相同的,一遍又一遍地使用相同的记录。可能是什么问题,这是一个完成填充数据和传递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);
    }

2 个答案:

答案 0 :(得分:3)

这一行需要在循环内部:

DimCustomersIndexViewModel CustomerItem = new DimCustomersIndexViewModel();

原因是您需要为每个客户创建一个新的视图模型,而是您当前只创建一个视图模型并更改其属性。将其添加到列表时,您不会添加副本;您正在添加已添加的相同视图模型。

如果DimCustomersIndexViewModel是一个结构,这个代码就可以工作,因为结构只是一个没有固有身份的值的包,而是复制而不是引用它们。 (Technical comparison.)但它是一个类(应该是),具有唯一标识,因此您将单个视图模型中的引用一遍又一遍地添加到列表中。 Customerlist[0]CustomerList[1]以及所有其他项指向同一个DimCustomersIndexViewModel对象实例,其属性随后会被覆盖,并且等于最后一个客户。

通过在循环中移动此行,您将为每个客户创建一个单独的DimCustomersIndexViewModel,每个客户都有拥有的属性集,并且{{ 1}}包含对许多不同CustomerList对象实例的引用。


一旦您对此概念有了丰富的经验,未来的步骤可能是使用AutoMapper,这样您就不必在此处维护代码中所有属性的列表。

答案 1 :(得分:1)

问题是您在循环的每次迭代期间添加相同的引用对象。该对象永远不会更改(您再也不会new更改),但您更改了对象的属性。然后一遍又一遍地添加该对象。你需要在循环的每次迭代中新建那个对象。