ObjectDataSource создается дважды при изменении элемента управления - PullRequest
3 голосов
/ 16 марта 2009

Я использую ObjectDataSource с GridView с обработчиком OnObjectCreated в коде. Если я программно изменю значение дочернего элемента управления в GridView, весь элемент управления будет повторно привязан к базе данных в том же запросе (как показано обработчиком OnObjectCreated), что мне не нужно. Это происходит на первой странице запроса GET (так что это не проблема обратной передачи). Вот что показывает трассировка:

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

Есть ли способ предотвратить второй раунд привязки данных, даже если я манипулирую дочерними элементами управления? Ничего на уровне данных не меняется, так что это не нужно. Также обратите внимание, что не задействованы URL-адреса изображений, которые, по-видимому, также вызывают двойное связывание данных. Спасибо.

Обновление:

Я не уверен, помогает ли это или нет, но при просмотре трассировки стека в точке, где вызывается обработчик OnObjectCreated, отображаются следующие различия:

Первый вызов обработчика событий:

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 

Второй вызов обработчика событий:

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  

Опять же, это все из первоначального запроса GET. Есть идеи, почему его вызывают дважды?

Ответы [ 2 ]

2 голосов
/ 16 марта 2009

Может быть, вы должны использовать

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

Это то, что вы ищете?

0 голосов
/ 16 марта 2009

Является ли тот факт, что привязка данных происходит дважды в вашем сценарии, вызывает другие проблемы? Кстати, вы сами можете управлять созданием объекта источника данных, обрабатывая событие ObjectCreating. Если вы установите свойство ObjectDataSourceEventArgs.ObjectInstance в обработчике на допустимый (не нулевой) экземпляр, источник данных будет привязываться к этому экземпляру, а не создавать новый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...