我有以下属性来获取和设置Session变量......
protected List<Item> SearchResults
{
get
{
if (Session["SearchResults"] == null)
Session["SearchResults"] = new List<string>();
return ((List<string>) Session["SearchResults"]).Select(s => new Item(s)).ToList();
}
set { Session["SearchResults"] = value.Select(p => p.Serialize()).ToList(); }
}
如您所见,我将项目存储为序列化字符串。 当用户检查GridView中的几个复选框,然后单击提交时,我想修改他选择的Items的Selected属性的值。这是我执行此操作的代码,它工作得很好......
private void RecordSelections()
{
var searchResults = SearchResults; //localize session list
foreach (var checkBox in AssignGrid.Rows.Cast<GridViewRow>().Select(r => (CheckBox)r.FindControl("chkSelect")))
{
var result = searchResults.FirstOrDefault(r => r.Key == long.Parse(checkBox.Attributes["ItemKey"].ToString()));
if (result != null) result.Selected = checkBox.Checked;
SearchResults = searchResults; //store session list
}
}
我的问题是这个。我发现有必要本地化会话列表(参见注释行),然后存储该会话列表(也注释),但是当我通过getter访问这个Session变量时,它究竟发生了什么呢?我想做类似以下的事情来从列表中取出一个Item并修改它的值。我无法准确回答为什么这不起作用。如果我没有序列化对象(序列化项目的原因是another post)会不会有效?
private void RecordSelections()
{
foreach (var checkBox in AssignGrid.Rows.Cast<GridViewRow>().Select(r => (CheckBox)r.FindControl("chkSelect")))
{
var result = SearchResults.FirstOrDefault(r => r.Key == long.Parse(checkBox.Attributes["ItemKey"].ToString()));
if (result != null) result.Selected = checkBox.Checked;
}
}
提前感谢您的帮助。