2

Web アプリケーションで奇妙なことが起こっています。2 つの変数を保持する単純なオブジェクトのコレクションを保持するために使用する静的辞書があります。

static Dictionary<string, linkButtonObject> linkButtonDictonary = new Dictionary<string, linkButtonObject>();

リンクボタンを含むグリッドビューがあり、各ボタンに関するデータは、ディクショナリのボタンに関連付けられています。

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);
}

次に、linkbutton がクリックされると、UniqueId を使用してディクショナリで値を検索し、それらを SQL クエリで使用し、取得したデータを使用してグリッドビューにデータを入力し、ラベルを付け、ポップアップを表示します。

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();
}

これはすべてうまく機能し、リンクボタンのいずれかをクリックすると、ポップアップが正しく作成されて入力され、表示されます。

私の問題は、ページを数分間アイドル状態にしてからリンクボタンをクリックすると、エラーが発生することです。

ここに画像の説明を入力

私は何を間違っていますか、どうすれば修正できますか?

4

3 に答える 3

5

AppDomain が終了するたびに静的データが失われます。これは、IIS がワーカー プロセスのリサイクルを決定した場合など、時々発生します。

私よりずっと上手に説明できる人からこれを見てください!ASP.NET 静的変数の有効期間

別のデータ ストレージ パターンを探す必要があります。静的は、達成しようとしているものを前進させる方法ではありません。

于 2013-10-31T16:38:24.607 に答える
1

Web サイトにデバッガーをアタッチするか、診断コードを追加できますか? 例外が発生したときの辞書の内容は?

私の推測では、ボタンUniqueIDは一定ではなく、辞書にはまだデータが含まれていますが、ID は一致しなくなりました。あるいは、プロセス/アプリドメインがリサイクルされ、ディクショナリが何らかの形で空になっている可能性があります。

于 2013-10-31T16:37:40.610 に答える
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; } }

この例では、「キー」と「」の両方のペアを文字列として選択します。(これは私にとってはうまくいきます。

于 2014-10-06T10:37:03.517 に答える