Как ASP.NET узнает, какое событие должно сработать при обратной передаче? - PullRequest
3 голосов
/ 03 апреля 2012

Во время обратной передачи переменная формы __EVENTTARGET содержит name of the control, который отправил обратную передачу.Как ASP.NET узнает, какое событие нужно запустить для этого элемента управления, если этот элемент управления поддерживает несколько событий на стороне сервера?

Ответы [ 5 ]

5 голосов
/ 03 апреля 2012

Как упоминает Wiktor, многие элементы управления в ASP.Net уже созданы для того, чтобы вы могли их использовать определенным образом;нажатие кнопки, изменение текста, изменение выбранного индекса - эти элементы управления были созданы для выполнения определенных задач, , поэтому они работают так, как работают .

Из документации:

Поскольку для большинства событий управления сервером ASP.NET требуется обратная передача на сервер для обработки, они могут повлиять на производительность страницы.Поэтому серверные элементы управления предлагают ограниченный набор событий, как правило, только события типа щелчка.Некоторые серверные элементы управления поддерживают события изменений.Например, элемент управления веб-сервера CheckBox вызывает событие CheckedChanged в коде сервера, когда пользователь щелкает поле.Некоторые серверные элементы управления поддерживают более абстрактные события.Например, серверный веб-элемент управления Calendar вызывает событие SelectionChanged, которое является более абстрактной версией события щелчка.

Конечно, вы можете написать свои собственные клиентские элементы управления, но это требует многобольше работы.В статье Обработка событий сервера в ASP.Net обсуждается это.Подводя итог, можно сказать, что важным разделом является реализация RaisePostBackEvent

Если вы хотите предоставить несколько событий, вы изменяете аргумент события, отправляемый этому методу с клиента, и вызываете соответствующий сервер.параллельное событие.Это может быть так же просто, как утверждение if.Базовым примером может быть наличие двух событий javascript на стороне клиента, каждое из которых может вызвать:

__doPostBack(controlId, 'superclick');

__doPostBack(pageId, 'superchange');

А затем, в вашем обработчике событий обратной передачи, вызвать требуемое событие на стороне сервера на основе переданного аргумента.Простой обработчик на стороне сервера RaisePostBackEvent будет выглядеть примерно так:

  public void RaisePostBackEvent(string eventArgument){

     if(eventArgument == "superclick")
     {
        OnSuperClick(this, new EventArgs());
     }

     if(eventArgument == "superchange")
     {
        OnSuperChange(this, new EventArgs());
     }         

  }
2 голосов
/ 03 апреля 2012

Отладка с помощью HTTP-сниффера, такого как Fiddler , может помочь здесь.В общих чертах, сведения о событии находятся в __EVENTARGUMENT поле формы .Способ распаковки этих данных является подробностью реализации конкретного элемента управления.

Например, перетащите TreeView на форму и подключите его события TreeNodeCollapsed, TreeNodeExpanded и SelectedNodeChanged.Вы увидите, что расширение или свертывание узла приводит к обратной передаче с чем-то вроде tnode_text in __EVENTARGUMENT;тогда как выбор узла приводит к обратной передаче с чем-то вроде snode_text в __EVENTARGUMENT.Я предполагаю, что t означает «переключение», а s - «выбор», но я не копался в источнике для проверки.

(Кстати, просто сказать «переключение» хорошодостаточно как для раскрытия, так и для свертывания, поскольку переменная формы ..._ExpandState содержит сведения о состоянии раскрытия всех узлов, это выглядит так).

1 голос
/ 03 апреля 2012

Для обработки обратной передачи серверное управление ASP.NET должно реализовывать интерфейс IPostBackEventHandler.Этот интерфейс имеет единственный метод void RaisePostBackEvent(string eventArgument), который обрабатывает событие, возникающее при отправке формы на сервер.

Этот метод отвечает за получение событий элемента управления на стороне сервера.Единственным параметром здесь является eventArgument , который используется для дифференциации типа события при необходимости (например, GridView).

Например, Button Элемент управления поднимает как Click, так иCommand событий.GridView анализирует имя команды из параметра аргумента события и запускает необходимое для команды событие.

Вы можете использовать декомпилятор .NET (я использовал для этого превосходный JetBrains dotPeek ), чтобы посмотретьчерез реализацию RaisePostBackEvent метода для стандартных элементов управления ASP.NET.

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

Если вы хотите обработать событие обратной передачи в вашем элементе управления, вы реализуете интерфейс IPostBackEventHandler .Фреймворк будет вызывать метод IPostBackEventHandler.RaisePostBackEvent, который принимает eventArgument.На основе аргумента события вы можете вызывать различные другие пользовательские события.

Другие события Control, такие как Init, Load и т. Д., Будут вызываться платформой автоматически, независимо от того, может ли элемент управления обрабатывать события обратной передачи.

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

Полагаю, что в случае элементов управления, которые содержат значение single , переданное в данных формы, не нужно места для сомнений - TextBox может быть изменено , DropDownList может иметь значение изменено и т. д.

Фактически, такие элементы управления обычно имеют только одно событие, инициируемое на стороне клиента, другие события относятся к конвейеру на стороне сервера (DataBinding, DataBound, Init, Load и т. Д.)

Любой составной элемент управления, с другой стороны, может использовать __EVENTARGUMENTS для предоставления серверу дополнительных параметров, чтобы можно было определить и отправить фактическое событие.

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