Почему мой ApplicationCache передает ссылку вместо значения?

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

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам