C# ViewModel为所有500+;将记录添加到视图中

C# ViewModel为所有500+;将记录添加到视图中,c#,asp.net-mvc,viewmodel,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Viewmodel,Asp.net Mvc Viewmodel,我不熟悉使用ViewModels,这里有一个新列表,通过循环数据库表向其中添加项目。问题是所有返回的记录都是相同的,反复使用相同的记录。有什么问题吗?这是完成填充数据和传递ViewModel的好方法还是有更好的方法?现在它返回大约500条具有相同数据的记录 public class DimCustomersController : Controller { private AdventureWorks_MBDEV_DW2008Entities db = new AdventureWork

我不熟悉使用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);
    }
公共类DIMCustomerController:控制器
{
private AdventureWorks\u MBDEV_uDW2008EntitiesDB=新冒险工程\u MBDEV_uDW2008Entities();
公共操作结果CustomerIndexVM()
{
List CustomerList=新列表();
DimCustomersIndexViewModel CustomerItem=新的DimCustomersIndexViewModel();
foreach(db.dimcusters.ToList()中的var m)//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;
//其他栏目在这里
CustomerList.Add(CustomerItem);
}
返回视图(“CustomerIndexVM”,CustomerList);
}

此行需要在循环内:

DimCustomersIndexViewModel CustomerItem=new-DimCustomersIndexViewModel();

原因是您希望每个客户都有一个新的视图模型,但您当前只创建一个视图模型并更改其属性。将其添加到列表中时,您并不是在添加副本,而是在添加已添加的相同视图模型

如果
DIMCustomerIndexviewModel
是一个结构,则此代码可以工作,因为结构只是一个没有固有标识的值包,它们是复制的,而不是引用的。但它是一个类(应该是这样的),具有唯一标识,因此您要反复将对单视图模型的引用添加到列表中。
Customerlist[0]
Customerlist[1]
和所有其他项指向相同的
DIMCustomerIndexviewModel
对象实例,然后覆盖其属性并使其与最后一个客户相同

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



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

这一行需要在循环中:

DimCustomersIndexViewModel CustomerItem=new-DimCustomersIndexViewModel();

原因是您希望每个客户都有一个新的视图模型,但您当前只创建一个视图模型并更改其属性。将其添加到列表中时,您并不是在添加副本,而是在添加已添加的相同视图模型

如果
DIMCustomerIndexviewModel
是一个结构,则此代码可以工作,因为结构只是一个没有固有标识的值包,它们是复制的,而不是引用的。但它是一个类(应该是这样的),具有唯一标识,因此您要反复将对单视图模型的引用添加到列表中。
Customerlist[0]
Customerlist[1]
和所有其他项指向相同的
DIMCustomerIndexviewModel
对象实例,然后覆盖其属性并使其与最后一个客户相同

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



一旦你对这个概念有了坚实的经验,未来的一步可能是使用它,这样你就不必在这里维护代码中所有属性的列表。

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

问题是在循环的每次迭代中添加相同的引用对象。该对象从未更改(您再也不会更新它),但您可以更改对象的属性。然后反复添加该对象。您需要在循环的每次迭代中更新该对象。

除了根据答案初始化循环中的视图模型外,您还可以使用
var CustomerList=db.dimcusters.Select(x=>new-DimCustomersIndexViewModel{Title=x.Title,FirstName=x.FirstName,…}.ToList();
除了根据答案初始化循环内的视图模型外,还可以使用
var CustomerList=db.dimcusters.Select(x=>new-DimCustomersIndexViewModel{Title=x.Title,FirstName=x.FirstName,…}.ToList();
谢谢,这就是问题所在;令人惊讶的是,我错过了简单的东西:)谢谢,这就是问题所在;令人惊讶的是,我错过了简单的东西:)