Это странная вещь, с которой я только что столкнулся.
У меня есть веб-приложение с небольшой таблицей данных, хранящейся в 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.
Веб-страница работает нормально. Я могу выбрать свое значение, и правильные значения будут вставлены в текстовое поле. Однако когда я перехожу на другую страницу и возвращаюсь на эту страницу. В моем раскрывающемся списке для выбора доступно только одно значение.
Когда я вытащил отладчик, я заметил, что при возврате на веб-страницу, когда метод GetAllDeptDivActCodes возвращает DataTable из кеша, свойство DefaultView RowFilter все еще применяется к DataTable, что вызывает проблему.
На данный момент я исправил проблему, просто сбросив DefaultView RowFilter после завершения обработки в событии SelectedIndexChanged, но почему приложение возвращает то, что кажется ссылкой на DataTable в кеше приложения, когда я ожидал отдельную копию ( или стоимость) объекта?





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