5

以前は、静的変数を使用して、ポストバック間で保存する変数データを保持していました。問題があり、appdomain が終了するとこれらの変数のデータが失われることがわかりました。そこで、いくつかの調査を行い、ViewStates を使用することにしました。

static Dictionary<string, linkButtonObject> linkButtonDictonary;


protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["linkButtonDictonary"] != null)
    {
        linkButtonDictonary = (Dictionary<string, linkButtonObject>)ViewState["linkButtonDictonary"];
    }
    else
    {
        linkButtonDictonary = new Dictionary<string, linkButtonObject>();
    }
}

そして、これが私が使用する非常に単純なクラスです。

[Serializable]
public class linkButtonObject
{
    public string storyNumber { get; set; }
    public string TaskName { get; set; }
}

グリッドビューがデータバインドされているため、linkBut​​tonDictionary に追加しています。

protected void hoursReportGridView_OnRowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        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);
    }
}

以前の問題は解決されたようですが、新しい問題が発生しています。ポストバックすると、次のエラーが発生することがあります。

[A]System.Collections.Generic.Dictionary 2[System.String,linkButtonObject] cannot be cast to [B]System.Collections.Generic.Dictionary2[System.String,linkBut​​tonObject]. タイプ A は、場所「C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0」の「LoadNeither」コンテキストの「mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089」から発生します。 .0__b77a5c561934e089\mscorlib.dll'. タイプ B は、場所「C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0」のコンテキスト「LoadNeither」の「mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089」から発生します。 .0__b77a5c561934e089\mscorlib.dll'.

どこでも同じクラスを使用しているときに、キャストの問題が発生する可能性があることを理解していません。私は何を間違っていますか、どうすれば修正できますか?

4

2 に答える 2

4

ご意見をお寄せいただきありがとうございます。問題を追跡するのに役立ちました。

.aspx.cs ページに単純なクラスがありました。

[Serializable]
public class linkButtonObject
{
    public string storyNumber { get; set; }
    public string TaskName { get; set; }
}

これが、アセンブリが 2 回読み込まれ、問題が発生した理由です。

于 2013-10-31T21:47:55.920 に答える
3

これは、次の問題とまったく同じように見えます。

シリアル化および逆シリアル化時の InvalidCastException

解決策については、アセンブリのロードなどを処理することは制御できない場合があります。

簡単な方法は、XML Serialize/JSON です。データを文字列としてシリアル化し、その文字列を ViewState に保存します。元に戻すには、プロセスを逆にする必要があります。これにより、重複したロードの問題が確実に処理されます。

于 2013-10-31T21:34:22.460 に答える