Je suis dans le besoin de transmettre des résultats de la base de données. Au lieu de passer un ensemble de données entier, ou une requête sql construite, j'ai essayé de passer un objet configuré LinqDataSource.Passage de LinqDataSource via la session: 'DataContext accessible après Dispose.'
Sur la page source, je configure les propriétés de l'objet LinqDataSource Où et WhereParameters en utilisant les valeurs définies par l'utilisateur sur les commandes affichées sur la page (boîte de recherche, zone de liste déroulante, etc.). Je passe l'objet autour pour éviter la reconfiguration LinqDataSource sur la page du récepteur.
Mais, même si cela a fonctionné très bien sur mon système de développement, après le déploiement sur un serveur dédié j'ai eu une erreur en disant ce qui suit:
Impossible d'accéder à un objet disposé.
Nom de l'objet: 'DataContext accessible après Dispose.'.
Sur les deux pages, la source et le récepteur, les objets LinqDataSource sont déclarés comme:
<asp:LinqDataSource ID="myLinqDS" runat="server"
ContextTypeName="MyProject.MyDBNamedpace.MyDataContext"
TableName="TheTable"
OrderBy="field1, field2"
</asp:LinqDataSource>
Pour passer l'objet DataSource autour de moi ceci:
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);
Et pour récupérer , sur le codebehind de PageToDisplayTheData.aspx:
myLinqDS =
(LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];
aDataList.DataSource = myLinqDS;
aDataList.DataBind();
Le jeu de résultats est filtré à l'aide des données fournies par l'utilisateur: recherche, zones de liste déroulante, boutons radio, etc. Dans l'exemple ci-dessus, j'ai encapsulé cette logique sur SetLinqDataSourceWhereAndHisParameters(). – Seiti
Et je sais que passer LinqDataSource va à nouveau frapper la base de données, à cause du comportement de linq. Je voulais juste éviter de passer moins d'infos et devoir répéter des opérations (DRY?) – Seiti