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



我是使用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);
    }

这一行需要在循环内:

DimCustomersIndexViewModel CustomerItem = new DimCustomersIndexViewModel();

原因是您希望为每个客户创建一个新的视图模型,但是您目前只创建了一个视图模型并更改了它的属性。当你将它添加到列表中时,你并没有添加一个副本;您正在添加您已经添加的相同视图模型。

如果DimCustomersIndexViewModel是一个结构体,这段代码将工作,因为结构体只是一袋没有固有标识的值,它们被复制而不是被引用。(技术比较。)但它是一个类(应该是),具有唯一标识,因此您要不断向列表中添加单个视图模型的引用Customerlist[0]CustomerList[1]以及所有其他项都指向同一个DimCustomersIndexViewModel对象实例,然后覆盖其属性并使其等于最后一个客户。

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


一旦您对这个概念有了扎实的经验,下一步可以使用AutoMapper,这样您就不必在这里的代码中维护所有属性的列表。

问题是您在每次循环迭代期间都添加了相同的引用对象。该对象永远不会改变(您永远不会再次对其进行new),但是您更改了对象的属性。然后你不断地添加这个对象。您需要在循环的每次迭代中创建该对象。

相关内容

  • 没有找到相关文章

最新更新