ObjectDataSource запускается дважды или самостоятельно - PullRequest
3 голосов
/ 15 апреля 2010

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

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

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 15 апреля 2010

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

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

1 голос
/ 05 марта 2016

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

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

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

0 голосов
/ 17 апреля 2012

Я получал один и тот же результат с привязкой данных дважды, используя asp:DataList и asp:ObjectDataSource.

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

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

Я устал от пользовательских контролей. Я вижу, как они могут повысить производительность 5-го класса, но на более высоком уровне это пустая трата времени.

0 голосов
/ 09 ноября 2011

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

0 голосов
/ 15 апреля 2010

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

gv.DataSourceID=dsObjDataSource;

тогда сетка вызывает gv.DataBind() сама по себе.

0 голосов
/ 15 апреля 2010

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

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