2

ユーザーコントロールを動的にロードするASP.Netページがあり、それらの間でデータテーブルを共有したい

私は次のようにセッション状態を使用しました

HttpContext.Current.Session["DataTable"] = DT;

ユーザーコントロールで次のようにアクセスしました

gridVw.DataSource =(DataTable) HttpContext.Current.Session["DataTable"] ;
 gridVw.DataBind();

データは正常にロードされますが、問題は、サーバー側またはポストバックでイベントにアクセスしているときに、無効なビューステートのエラーが発生することです(IEのみ)

また、ページからセッションにアクセスすると、ポストバック中に同じ問題が発生します

これがエラーページです

このページの状態情報は無効であり、破損している可能性があります。FormatException:入力は、Base 64以外の文字、2つを超えるパディング文字、またはパディング文字の中に不正な文字が含まれているため、有効なBase-64文字列ではありません。]
System.Convert.FromBase64_ComputeResultLength(Char * inputPtr、Int32 inputLength)+10545429 System.Convert.FromBase64CharPtr(Char * inputPtr、Int32 inputLength)+71
System.Convert.FromBase64String(String s) +41System.Web.UI.ObjectStateFormatter
。 Deserialize(String inputString、目的目的)+66
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter2.Deserialize(String serializedState、目的目的)+8
System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2フォーマッター、文字列serializedState、目的)+40
System.Web.UI.HiddenFieldPageStatePersister.Load()+127

[ViewStateException:無効なビューステート。

セッションに長いデータがあるか、デリメータがゼロであるか、または原因となる理由が何であれ、それが原因だと思います

System.Convert.FromBase64

別のセッション変数(ダミー番号)を使用し、ユーザーコントロールからアクセスして、このユーザーコントロールに問題がなく、問題がないことを確認しました。

問題は、Sessionを使用してデータテーブルを保存したくないということです。その欠点はわかっていますが、他に何か提案はありますか? :静的メソッド(WebMethod)でWebページにユーザーコントロールを読み込んでいるため、考えられる回避策を実行できません。

4

1 に答える 1

0

セッション変数を使用する必要はまったくありません。ユーザー コントロールのパブリック関数 (またはプロパティ) を Web アプリケーションに公開すると、テーブルをコントロールに割り当てることができます。例:

Partial Class user_controls_myControl
    Inherits System.Web.UI.UserControl
   'create a public method your app can see:

   Public Sub bindData(ByVal dt As dataTable)
   End Sub

End Class 

その後、次のようにメイン アプリからアクセスできます。

dim mydataTable as dataTable
'fill the datatable
dim myControl as myControl1
myControl.bindData(mydataTable)
于 2013-03-08T18:47:17.443 に答える