2013-10-31 3 views
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; } 
} 

GridViewコントロールがデータバインドされたように私は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.Dictionary 2[System.String,linkButtonObject]. Type A originates from 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the context 'LoadNeither' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. Type B originates from 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the context 'LoadNeither' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'.

:いつか私はポストバック時に、私はこのエラーを取得しています。私は間違って何をしていますか、どうすれば修正できますか?

+1

どういうわけか、別の読み込みコンテキストで同じアセンブリ(mscorlib)を読み込むことができました。 Assembly.LoadFrom()を使用していますか、それをロードするmscorlibや他のコンポーネントをロードするのに似ていますか? – Pete

+1

Fusion Log Viewerを使用して、問題を追跡することができます。http://msdn.microsoft.com/en-us/library/e74a18c4%28VS.71%29.aspx – Pete

+0

プログラムでアセンブリを読み込むことはありません。 mscorlibが何であるか知りません。 –

答えて

3

皆様からのご意見ありがとうございました。問題の追跡に役立ちました。

私は.aspx.csページに私の単純なクラスを持っていた:

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

アセンブリが二回ロードし、問題の原因となった理由です。

+1

面白い!共有いただきありがとうございますので、少なくともこの問題には1つの直接的な解決策があります! – Abhinav

+0

こんにちは。あなたはどこにクラス定義を入れましたか? :) – Carlos

2

これはまさに、次の問題のようになります。

InvalidCastException when serializing and deserializing

液として、それはアセンブリの負荷を処理するためにあなたのコントロールの外にあるかもしれないなど

簡単な手法であるXMLシリアライズ/ JSONデータを文字列としてシリアル化し、その文字列をViewStateに保存します。それを取得するには、プロセスを逆にするだけです。これは、重複した負荷の問題を確実に処理します。