Почему мой ApplicationCache передает ссылку вместо значения? - PullRequest
0 голосов
/ 27 декабря 2008

Это странная вещь, с которой я только что столкнулся.

У меня есть веб-приложение с небольшой таблицей DataTable, хранящейся в ApplicationCache, чтобы сократить количество запросов до отдельного, поскольку данные являются справочной таблицей, которая меняется не часто.

Я получаю доступ к этой таблице данных дважды на данной странице. Один раз, чтобы связать данные с выпадающим списком в моем методе 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 из кэша, свойство DataView RowFilter все еще применяется к DataTable, что и вызывает проблему. *

Я исправил проблему на данный момент, просто сбросив RowFilter DefaultView после того, как обработка выполнена в событии SelectedIndexChanged, но почему приложение возвращает то, что представляется ссылкой на DataTable в кеше приложения, когда я ожидал отдельная копия (или значение) объекта?

1 Ответ

2 голосов
/ 27 декабря 2008

Это по замыслу. Всякий раз, когда вы сохраняете объект в состоянии приложения или состояния сеанса, вам возвращают реальный объект (или, как вы указали, ссылку на объект) при доступе к нему. По своему дизайну .NET объекты почти всегда передаются по ссылке, если не указано иное. Например, при передаче объектов в функции они передаются по ссылке.

...