编辑其中一个相同的对象会改变另一个

时间:2017-09-27 17:21:17

标签: asp.net object

在我的申请中,我正在尝试编辑发票的项目。由于复杂性,我选择从多个表中删除原始项目并重新插入更新的项目。

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

请注意,发票对象和项目对象都是序列化的capeable,因此我可以在ViewState中使用它们。

我的视觉工作室是否正常运作或背后是否存在逻辑?

修改

        BankCheque originalCheque = (BankCheque)ViewState["OriginalCheque"];
        BankCheque cheque = (BankCheque)ViewState["OriginalCheque"];
        cheque.chequeCode = tb_chequeCode.Text;
        cheque.client = new Client();
        cheque.client.clientID = hidden_clientId.Value;
        cheque.chequeIssueDate = DateTime.Parse(tb_issueDate.Text);
        cheque.chequePaymentDate = DateTime.Parse(tb_paymentDate.Text);
        cheque.chequeAmount = float.Parse(tb_chequeValue.Text);
        if (cb_chequePaid.Checked)
        {
            cheque.paid = 1;
        }
        else
        {
            cheque.paid = 0;
        }

        cheque.invoices = getNewInvoicesList();
        cheque = addPaymentsToCheque(cheque);

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;
    }

1 个答案:

答案 0 :(得分:1)

您的根本问题在于此块:

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

当您在视图状态中读取时,您将创建对同一对象的两个引用。无论你操纵哪个变量,两者都会改变,因为它们都指向同一个底层对象。

为了完成您尝试做的事情,您需要一次读取视图状态,然后克隆该对象。在这种情况下,因为你想要一个全新的副本 - 包括所有的子对象 - 你要做的就是制作一个&#34;深拷贝&#34;或者&#34;深度克隆&#34;原来的。这个问题的答案可以帮助您入门:Deep cloning objects

一旦你有了克隆的方法,你就会想要将上面的块更新为:

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

此时,您将有两个独立的对象进行操作。