ObjectDataSource срабатывает дважды или самостоятельно

Может ли кто-нибудь точно объяснить, как / когда срабатывает ObjectDataSource? У меня есть страница ASP.NET с GridView, которая ссылается на ODS. Я установил точку останова в методе, который использует ODS, и заметил, что он срабатывает дважды.

Я заглянул в код, и ответ сначала показался очевидным. я имел

    Page_Load()
    {
      if(!Page.IsPostBack)
      {
          MethodA();
          MethodB();
      }
    }

где MethodA и MethodB в конечном итоге вызывали gv.DataBind (). Это имело смысл, потому что я предполагаю, что каждый вызов GridView.DataBind () приведет к запросу данных в ODS и, следовательно, к запуску моего метода доступа к данным.

Странно то, что при комментировании вызова MethodA он срабатывает дважды. Проверка стека вызовов показывает, что метод запускается сначала как результат MethodB, а затем снова без следа, кроме [External Code]. Эта загадочная загрузка не происходит, когда я позволяю выполнить оба метода MethodA и MethodB.

Есть идеи, что здесь происходит? Любая идея, какой у меня может быть другой код, который запрашивает данные у ODS? Я начинаю думать, что все эти элементы управления данными «без кода» - это больше обфускация и ерунда, чем они того стоят.


person LoveMeSomeCode    schedule 14.04.2010    source источник


Ответы (6)


Я столкнулся с этой проблемой, когда мы динамически скрывали / отображали столбец gridview в коде.

На этой странице рассказывается о некоторых проблемах, которые могут вызвать множественный выбор http://forums.asp.net/t/1161164.aspx

person Homer    schedule 14.04.2010
comment
Да, оказалось, что мы скрываем / показываем столбцы в событии GridView.DataBound, и если мы этого не сделаем, он не сработает дважды. Я проверю вашу ссылку, но какой метод вы использовали для решения ситуации? - person LoveMeSomeCode; 15.04.2010

Множественные вызовы метода привязки данных gridview могут происходить неявно, если вы меняете видимость, т. Е. Показываете и / или скрываете столбцы gridview, привязанные к источнику данных объекта.

В этом сценарии попробуйте инкапсулировать код столбца отображения / скрытия gridview в обработчике событий Page_LoadComplete.

Обработчик событий Page_LoadComplete занимает ведущее место в жизненном цикле страницы, чтобы предотвратить множественные вызовы привязки данных и по-прежнему быть эффективным, поскольку он вызывается после событий изменения элемента управления (например, нажатие кнопки, изменение выбранного индекса и т. Д.) Еще до привязки данных gridview Мероприятия.

person Scott Software    schedule 04.03.2016

«когда закомментируем вызов MethodA, он все равно срабатывает дважды». Таким образом, вероятно, будет дважды вызван Page_Load. Вероятно, у вас есть AutoEventWireup = "true", а также событие регистрации в коде http://www.aspdeveloper.net/tiki-index.php?page=ASPFaqEventsDoubleFire

person Tomas Voracek    schedule 14.04.2010
comment
нет, похоже, что Page_Load вызывается только один раз. Хотя спасибо за ссылку, посмотрю. - person LoveMeSomeCode; 15.04.2010

Если вы установите источник данных для gridview с чем-то вроде

gv.DataSourceID=dsObjDataSource;

тогда представление сетки вызывает gv.DataBind() самостоятельно.

person mikek3332002    schedule 15.04.2010
comment
Не имеет значения, какой из двух файлов устанавливает это свойство (aspx и aspx.cs) - person mikek3332002; 18.04.2010

У меня была та же проблема - проблема заключалась в том, что я скрывал / показывал столбец после или во время привязки данных. Перемещение кода скрытия / показа до привязки данных остановило повторную привязку дважды, что, как я подозреваю, является тем же эффектом, что и перемещение ее в Page_Load. В моем случае привязка данных происходила в ответ на изменение раскрывающегося списка - добавление / удаление столбца до того, как вызов DataBind() устранил для меня двойную проблему.

person Eric Sassaman    schedule 09.11.2011
comment
В нашем сценарии также оказалось, что у нас есть несколько столбцов, указанных в разметке, и ods получат их и выполнят привязку в первый раз, а затем мы динамически внедрили столбцы с классами ITemplate, и это вызвало повторное связывание. Я ненавижу ОРВ. - person LoveMeSomeCode; 10.11.2011

Я получал тот же результат с DataBinding, повторяющимся дважды, используя asp:DataList и asp:ObjectDataSource.

Оказалось, потому что я использовал UserControl в параметрах выбора:

<asp:ControlParameter Name="GroupID" Type="Int32" DefaultValue="-1"
    ControlID="UserControl1" PropertyName="SelectedGroupID" />

Я устаю от UserControls. Я понимаю, что они могут повысить продуктивность пятиклассников, но на более высоком уровне они являются пустой тратой времени.

person LHudson73    schedule 17.04.2012
comment
На самом деле мне надоели все веб-формы ASP.NET. Сменил работу, и теперь я занимаюсь MVC. Это не идеально, но я не скучаю по безумному черному ящику элементов управления веб-формами. - person LoveMeSomeCode; 18.04.2012