Asp.net 编辑一个相同的对象会更改另一个对象

Asp.net 编辑一个相同的对象会更改另一个对象,asp.net,object,Asp.net,Object,在我的应用程序中,我试图编辑发票的项目。由于复杂性,我选择从多对多表中删除原始项,然后重新插入更新的项 在我的代码中,我有两个对象,原始发票和更新的发票。两者都是相同的,因为它们都来自同一个ViewState对象。当我编辑更新的发票对象时,我发现原始发票对象也已更新 请注意,invoice对象和item对象都是可序列化的,因此我可以在ViewState中使用它们 我的VisualStudio是否出了问题,或者背后有什么逻辑 编辑 getNewInvoicesList方法是 private Lis

在我的应用程序中,我试图编辑发票的项目。由于复杂性,我选择从多对多表中删除原始项,然后重新插入更新的项

在我的代码中,我有两个对象,原始发票和更新的发票。两者都是相同的,因为它们都来自同一个ViewState对象。当我编辑更新的发票对象时,我发现原始发票对象也已更新

请注意,invoice对象和item对象都是可序列化的,因此我可以在ViewState中使用它们

我的VisualStudio是否出了问题,或者背后有什么逻辑

编辑

getNewInvoicesList方法是

private List<ClientInvoice> getNewInvoicesList()
    {
        DataTable dt = (DataTable)ViewState["invoicesDt"];
        List<ClientInvoice> invoices = new List<ClientInvoice>();
        ClientInvoice invoice;
        foreach (DataRow row in dt.Rows)
        {
            invoice = new ClientInvoice();
            invoice.invoiceID = Convert.ToInt32(row[0].ToString());
            invoices.Add(invoice);
        }
        return invoices;
    }
private List getNewInvoicesList()
{
DataTable dt=(DataTable)视图状态[“invoicesDt”];
列表发票=新列表();
客户发票;
foreach(数据行中的数据行)
{
发票=新客户发票();
invoice.invoiceID=Convert.ToInt32(行[0].ToString());
发票。添加(发票);
}
退回发票;
}

您的根本问题在于此块:

BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"];
BankCheque cheque = (BankCheque)ViewState["OriginalCheque"];
在视图状态下读取时,将创建对同一对象的两个引用。无论操作哪个变量,它们都会发生变化,因为它们都指向同一个底层对象

为了完成您试图执行的操作,您需要在中读取一次视图状态,然后克隆对象。在这种情况下,因为您需要一个全新的副本(包括所有子对象),所以您要做的是对原始对象进行“深度复制”或“深度克隆”。此问题的答案应有助于您开始:

一旦有了要克隆的方法,就需要将上面的块更新为类似以下内容:

BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"];
BankCheque cheque = originalCheque.Clone();

此时,您将有两个独立的对象要操作

Visual Studio与应用程序的运行时行为无关。此外,在没有看到任何代码的情况下,也无法回答这个问题。也许您在使用引用类型变量时遇到了问题?我添加了代码,在调用getNewInovicesList方法之后,原始支票也被更改了
BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"];
BankCheque cheque = originalCheque.Clone();