【问题标题】:Why is my ApplicationCache passing back a reference instead of a value?为什么我的 ApplicationCache 传回的是引用而不是值?
【发布时间】:2008-12-27 00:06:32
【问题描述】:

这是我刚刚遇到的一件奇怪的事情。

我有一个 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 来解决这个问题,但是为什么应用程序返回似乎是对应用程序缓存中 DataTable 的引用,而我期待对象的单独副本(或值)?

【问题讨论】:

    标签: asp.net datatable application-cache


    【解决方案1】:

    这是设计使然。每当您将对象存储在 Application State 或 Session State 中时,当您访问它时,您将返回实际对象(或者您将其放置为对该对象的引用)。按照设计,.NET 对象几乎总是通过引用传递,除非您另外指定。例如,当将对象传递给函数时,它们是通过引用传递的。

    【讨论】:

    • 很高兴知道!!!这确实使 Web 应用程序中的事情变得更加高效,因为我正在提取一些缓存的用户详细信息或查找代码,所以在任何地方都没有它的副本是非常好的。谢谢!!!
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2015-09-30
    • 2015-03-24
    • 2021-01-06
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多