我的网络应用程序中发生了一些奇怪的事情。我有一个静态字典,用于存放一组包含两个变量的简单对象:
static Dictionary<string, linkButtonObject> linkButtonDictonary = new Dictionary<string, linkButtonObject>();
我有一个带链接按钮的网格视图,每个数据都与其按钮相关联。字典中的UniqueId:
protected void hoursReportGridView_OnRowDataBound(Object sender, GridViewRowEventArgs e)
{
LinkButton btn = (LinkButton)e.Row.FindControl("taskLinkButton");
linkButtonObject currentRow = new linkButtonObject();
currentRow.storyNumber = e.Row.Cells[3].Text;
currentRow.TaskName = e.Row.Cells[5].Text;
linkButtonDictonary.Add(btn.UniqueID, currentRow);
}
然后当点击链接按钮时,我使用UniqueId在字典中查找值,在SQL查询中使用它们并使用检索到的数据填充gridview,标签并显示弹出窗口:
protected void taskLinkButton_Click(object sender, EventArgs e)
{
//create linkbutton object from sender
LinkButton btn = (LinkButton)sender;
//get a list of data relevant to column
string[] infoData = getInfoData(linkButtonDictonary[btn.UniqueID].storyNumber,
linkButtonDictonary[btn.UniqueID].TaskName);
//assign content of list to labels and gridview
productDatabaseLabel.Text = infoData[0];
storyNumberDatabaseLabel.Text = infoData[1];
taskDatabaseLabel.Text = infoData[2];
pointPersonDatabaseLabel.Text = infoData[3];
SqlDataSource6.SelectParameters["storynumber"].DefaultValue = linkButtonDictonary[btn.UniqueID].storyNumber;
SqlDataSource6.SelectParameters["tasktitle"].DefaultValue = linkButtonDictonary[btn.UniqueID].TaskName;
infoGridView.DataBind();
//show popup
MPE.Show();
}
这一切都很好,我可以点击任何链接按钮,他们正确创建并填充弹出窗口并显示它。
我的问题是,如果我让页面空闲几分钟然后点击一个链接按钮我就会收到错误:
我做错了什么以及如何解决?
答案 0 :(得分:5)
每次AppDomain结束时,您都将丢失静态数据,这将不时地执行,例如,当IIS决定回收您的工作进程时。
从能比我更好解释的人那里看到这个! Lifetime of ASP.NET Static Variable
您需要寻找替代数据存储模式。静力学并不是你想要实现的目标。
答案 1 :(得分:1)
您可以将调试器附加到您的网站,还是添加一些诊断代码?异常发生时字典的内容是什么?
我的猜测是按钮的UniqueID
不是常量,字典仍然包含您的数据,但ID不再匹配。或者,也许可以回收进程/ appdomain,并以某种方式清空字典。
答案 2 :(得分:0)
这也发生在我身上。如果您只查找临时存储空间。创建自己的KeyValuePair
课程,然后将其放在List<>
或object[ ]
中。
class Tupol
{
public Tupol() { }
public Tupol(string key,string value) { }
public string Key { get; set; }
public string Value { get; set; }
}
初始化:
List<Tupol> temp = new List<Tupol>();
获取价值:
foreach(Tupol in temp)
{ if(temp.Key == "foo") { Debug.WriteLine(temp.Value); break; } }
在这种情况下,我选择同时成为我的&#34; 键&#34;和&#34; 价值&#34;成对为 字符串 。 (这对我有用。)