2009-03-16 8 views
3

J'utilise ObjectDataSource avec un GridView avec un gestionnaire OnObjectCreated sur le code-behind. Si je modifie par programme une valeur de contrôle enfant sur GridView, le contrôle entier obtient une deuxième fois dans la même demande (comme indiqué par le gestionnaire OnObjectCreated), ce que je ne veux pas. Cela se produit sur la requête GET de la page initiale (il ne s'agit donc pas d'un problème de publication). Voici ce que montre une trace:ObjectDataSource créé deux fois lorsque le contrôle est modifié

aspx.page Begin PreRender 
Custom  IN handleDSObjectCreated() => tsDao: ETime.DAL.TimeSheetDAO  
Custom  OUT handleDSObjectCreated() 
Custom  IN handleDSObjectCreated() => tsDao: ETime.DAL.TimeSheetDAO  
Custom  OUT handleDSObjectCreated() 
aspx.page End PreRender 

Y at-il un moyen d'empêcher le second tour de databinding même si je manipule les commandes de l'enfant? Rien dans la couche de données ne change donc il n'est pas nécessaire. Notez également qu'il n'y a pas d'URL d'image impliquées qui semblent provoquer une double liaison de données. Merci.

Mise à jour:

Je ne sais pas si cela aide ou non, mais en regardant la trace de la pile au moment où le gestionnaire OnObjectCreated est appelé montre les différences suivantes:

premier gestionnaire d'événements invocation:

System.Web.dll!System.Web.UI.WebControls.GridView.DataBind() + 0x5 bytes 
System.Web.dll!System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() + 0x53 bytes 
System.Web.dll!System.Web.UI.WebControls.GridView.OnPreRender(System.EventArgs e = {System.EventArgs}) + 0x19 bytes 
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0x57 bytes 

second gestionnaire des événements d'appel:

System.Web.dll!System.Web.UI.WebControls.GridView.DataBind() + 0x5 bytes 
System.Web.dll!System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() + 0x53 bytes  
System.Web.dll!System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() + 0x46 bytes 
System.Web.dll!System.Web.UI.Control.EnsureChildControls() + 0x58 bytes 
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0x33 bytes 

Encore une fois, tout cela provient de la requête GET initiale. Des idées pour lesquelles il est invoqué deux fois?

Répondre

2

Peut-être que vous devriez utiliser

if(!IsPostBack){ 
//your code. 
} 

Est-ce que vous cherchez?

+0

Malheureusement pas. Cela se passe sur la requête initiale GET. –

0

Le fait que la liaison de données se produise deux fois dans votre scénario entraîne-t-il d'autres problèmes? Tout simplement, vous pouvez gérer vous-même la création de l'objet de source de données en gérant l'événement ObjectCreating. Si vous définissez la propriété ObjectDataSourceEventArgs.ObjectInstance dans le gestionnaire sur une instance valide (non null), la source de données se liera à cette instance plutôt que d'en créer une nouvelle.

+0

Le problème est de toucher inutilement deux fois la base de données à chaque requête - pas nécessairement la création de la source de données en double. Je pourrais sauver l'instance et mettre en cache le résultat, mais je préfère résoudre le problème de base. –

Questions connexes