データベースからいくつかの結果を渡す必要があります。データセット全体または構築されたSQLクエリを渡す代わりに、LinqDataSourceで構成されたオブジェクトを渡そうとしました。
ソースページで、ページに表示されるコントロール(検索ボックス、コンボボックスなど)でユーザーが設定した値を使用して、LinqDataSourceオブジェクトのプロパティWhereおよびWhereParametersを構成します。レシーバーページでのLinqDataSourceの再構成を回避するために、オブジェクトを渡します。
しかし、開発中のシステムでは正常に機能していても、専用サーバーにデプロイした後、次のようなエラーが発生しました。
破棄されたオブジェクトにアクセスできません。
オブジェクト名:'Disposeの後にアクセスされるDataContext。'。
ソースとレシーバーの両方のページで、LinqDataSourceオブジェクトは次のように宣言されます。
<asp:LinqDataSource ID="myLinqDS" runat="server"
ContextTypeName="MyProject.MyDBNamedpace.MyDataContext"
TableName="TheTable"
OrderBy="field1, field2"
</asp:LinqDataSource>
データソースオブジェクトを渡すには、次のようにします。
SetLinqDataSourceWhereAndHisParameters(); //just set Where and WhereParameters
Guid guid = Guid.NewGuid();
Session[guid.ToString()] = myLinqDS;
ScriptManager.RegisterStartupScript(this.Page,
typeof(Page),
"Redirect",
String.Format(@"window.open(""{0}"");",
this.ResolveClientUrl("~/PageToDisplayTheData.aspx?guid=" +
System.Web.HttpUtility.UrlEncode(guid.ToString())
),
true);
そして、取得するには、PageToDisplayTheData.aspxのコードビハインドで:
myLinqDS =
(LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];
aDataList.DataSource = myLinqDS;
aDataList.DataBind();