2013-03-28 3 views
9

Я использовал элемент управления <asp:Button />, а после рендеринга в браузере этот элемент управления не имеет назначенного свойства события click. Как именно он вызывает параллельное событие?Как вызывается метод __doPostBack? Где метод вызова?

ASPX-код:

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClickEvent" /> 

выше управление было вынесено в браузере, как следующий код:

<input type="submit" name="Button1" value="Button" id="Button1"> 

Следующий код отображается в браузере, который устанавливает __EVENTTARGET. Мое сомнение в том, как вызывается метод __doPostBack? Где метод вызова?

function __doPostBack(eventTarget, eventArgument) { 
     if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
      theForm.__EVENTTARGET.value = eventTarget; 
      theForm.__EVENTARGUMENT.value = eventArgument; 
      theForm.submit(); 
     } 
    } 
+3

Покажите нам свой код –

+0

_ «после рендеринга в браузере» _ Я думаю, вы вводите в заблуждение код сервера и клиента. –

+0

Я думаю, вы должны прочитать это http://support.microsoft.com/kb/306459, в котором описаны элементы управления сайтами Web Forms. По сути, postbacks выполняются с помощью javascript, скрытые поля __EVENTTARGET и __VIEWSTATE содержат информацию о том, что было нажато, и данные на странице соответственно.Вызывается сценарий __EVENTTARGET и т. Д., И вызывается соответствующий обработчик событий на стороне сервера. – bUKaneer

ответ

12

Простой ответ:__doPostBack функции JavaScript вызываются на основе конкретного <asp />управления и событий, которые он обрабатывает.

Детальный ответ: Это зависит.


Во-первых, давайте рассмотрим ваш пример. У вас есть <asp:Button />, который отображается как стандарт <input type="submit" />. Все в ASP.NET WebForms вращается вокруг стандартного тега HTML <form>. HTML <form> отправлен без использование или оказание помощи JavaScript, нажав кнопку <input type="submit" /> кнопка.

Имея это в виду, вы можете очень хорошо видеть (что вы уже заметили), что оказанная <input type="submit" /> кнопка делает не имеют onclick событие назначено. И, как вы можете видеть, форма отправляется при нажатии кнопки.

Когда дело доходит до того, как код back end (C#/VB.NET/etc.) Выполняется при нажатии кнопки <input type="submit" />: все это обрабатывается самой ASP.NET Framework и выходит за рамки этот вопрос/ответ.


Во-вторых, теперь давайте рассмотрим, что __doPostBack, и как она используется.__doPostBack - это просто вспомогательная функция JavaScript, используемая для отправки HTML <form>. По причинам, указанным выше, вы теперь знаете, почему кнопка <input type="submit" /> делает не необходимо вызвать функцию __doPostBack.

Для простоты, давайте взглянем на странице ASP.NET, который имеет <asp:DropDownList /> контроль, и он имеет обработчик события SelectedIndexChanged назначенную:

<asp:DropDownList ID="MyDropDownList" AutoPostBack="true" OnSelectedIndexChanged="MyDropDownList_SelectedIndexChanged" runat="server" /> 

<asp:DropDownList /> визуализируется следующим образом:

<select id="ctl00_MyDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MyDropDownList\',\'\')', 0)" name="ctl00$MyDropDownList"></select> 

Давайте проигнорируем функцию setTimeout в событии onchange - это просто хакерское обходное решение, используемое ASP.NET - и давайте сосредоточимся n функция __doPostBack внутри.

Как вы можете видеть здесь, то __doPostBack функция является вызывается обработчиком onchange событий. Основное различие заключается в том, что изменение значения <asp:DropDownList /> или <select /> управления не заставляет браузер отправлять форму!

В очередной раз ASP.NET Framework внутренне выполняет то, как выполняется обратный код при отправке формы (через функцию __doPostBack или нет).


Наконец, как и для деталей __doPostBack: она принимает два параметра - eventTarget и eventArgument. eventTarget содержит отображаемое свойство HTML id элемента управления, которое вызывает обратную передачу; и eventArgument - необязательный параметр, который может использоваться для передачи дополнительных данных в код конца.


Редактировать Дополнительная информация: ОП задал очень интересный вопрос - что происходит, когда есть больше чем одна кнопка отправки?

Ну, во время операции POST браузеры включают value<input type="submit" />, которые вызвали операцию для инициирования.

Это означает, что так же, как вы получаете значения своих <input /> элементов, вы также можете запросить, какая кнопка вызвала отправку!

+0

wow действительно понравилось это объяснение, использовали ASP.NET с последних 5 лет, но не пытались узнать, как он на самом деле работает в этих деталях !!! – Ali

+1

Рад, что это помогло! :-D – Jesse

4

Элемент управления представляет собой кнопку отправить, он может напрямую отправить форму на сервер без вызова метода __doPostBack. Поэтому в этом случае __dopostback не вызывается. __dopostback используется для элементов управления, не имеющих поведения отправки по умолчанию, например dropdownlist.

Проводка к серверному событию происходит через интерфейс ipostbackeventhandler, который реализуется вашим управлением. Для получения дополнительной информации, пожалуйста, проверьте этот http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx

+0

без вызова метода _dopostback, как инициализируется значение __EVENTTARGET. –

+0

Он не будет инициализирован, и вам это не понадобится, потому что кнопка отправляет форму напрямую, а не через _dopostback. Структура asp.net знает, кто уволил событие, и он вызовет метод RaisePostBackEvent интерфейса ipostbackeventhandler, который будет подключать его к событие click на кнопке – Atti

3

Ну, причина, по которой вы сомневаетесь, заключается в том, что вы думаете, что функция __doPostBack необходима для публикации. Но это наоборот, когда html был впервые спроектирован, только способ отправить обратно на сервер был через кнопку отправки. Эта функциональность была встроена в браузер самостоятельно, так что когда была нажата кнопка отправки, браузер передавал данные формы объявленному местоположению. но по мере развития Интернета люди стали требовать больше. Теперь другим элементам управления также необходимо отправить обратно на сервер. Для их реализации были разработаны различные хаки, наиболее известная функция __doPostBack - одна из них. любой элемент управления, который теперь отправляет, может отправлять сообщения с помощью функции __doPostBack. Но кнопка submit делает это сама. Это все.

Смежные вопросы