这是我遇到的一件奇怪的事。
我有一个Web应用程序,在ApplicationCache中存储了一个小的DataTable,以减少单独查询的数量,因为数据是一个不经常更改的查找表。
我在给定页面中访问此DataTable两次。一旦将数据绑定到我的Page_Load方法中的下拉列表:
dtDeptDivAct = GetAllDeptDivActCodes()
dtDeptDivAct.DefaultView.Sort = "LongDescription ASC"
ddlDeptDivAccount.DataSource = dtDeptDivAct.DefaultView
ddlDeptDivAccount.DataTextField = "LongDescription"
ddlDeptDivAccount.DataValueField = "Id"
ddlDeptDivAccount.DataBind()
...并且在我的ddlDeptDivAct_SelectedIndexChanged事件中选择索引时从表中检索其他数据:
Dim dtDeptDivAct As DeptDivActDataTable
If ddlDeptDivAccount.SelectedIndex > 0 Then
dtDeptDivAct = GetAllDeptDivActCodes()
dtDeptDivAct.DefaultView.RowFilter = "Id = " & ddlDeptDivAccount.SelectedValue
txtAddFundingDept.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Department.ToString.PadLeft(2, Char.Parse("0"))
txtAddFundingDiv.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Division.ToString.PadLeft(2, Char.Parse("0"))
txtAddFundingAct.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Activity.ToString.PadLeft(3, Char.Parse("0"))
Else
txtAddFundingDept.Text = ""
txtAddFundingDiv.Text = ""
txtAddFundingAct.Text = ""
End If
注意:GetAllDeptDivActCodes()方法是一个从ApplicationCache对象返回表的简单方法。
网页运行正常。我可以选择我的值,并将正确的值插入到TextBox中。但是,当我转到另一个页面并返回此页面时。我的下拉列表只有1个可供选择的值。
当我启动调试器时,我注意到在返回到网页时,当GetAllDeptDivActCodes方法从缓存中返回DataTable时,DefaultView RowFilter属性仍然应用于DataTable,这导致了问题。
我已经解决了这个问题,只需在SelectedIndexChanged事件中完成处理后重置DefaultView RowFilter,但为什么Application会在我期待的时候返回应用程序缓存中似乎是对DataTable的引用的内容对象的单独副本(或值)?
答案 0 :(得分:2)
这是设计的。无论何时将对象存储在应用程序状态或会话状态中,当您访问它时,都会返回实际对象(或者当您将对象引用时)。按照设计.NET对象几乎总是通过引用传递,除非您另行指定。例如,当将对象传递给函数时,它们将通过引用传递。