2015-09-29 3 views
0

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

В ASP.NET элементы управления обычно имеют много событий. Например, класс LinkButton имеет событие Click.

Следующий код:

<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="LinkButton" /> 

переводится на это на стороне клиента:

<a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a> 

Как вы можете видеть, код клиента не определяет событие огня или обработчик событий ,

Так что мой вопрос, как известно, сервер он должен сгореть Click событий и LinkButton1_Click обработчик события, если единственное, что он получает от клиента идентификатор компонента (первый параметр __doPostBack метода)?

Что делать, если я хотел, чтобы компонент запускал другое событие, чем Click?

+0

Какое событие вы бы хотели уволить? Только щелчок имеет смысл в описанном сценарии, и именно так знает сервер. –

+0

Как сказал @zespri, нет другого события, к которому вы можете подключить его. Кнопка linkbutton также имеет командное событие, но нажимаются кнопки и команды - события на стороне сервера при нажатии. – Esko

+0

В этом случае да, но если бы у меня был пользовательский элемент управления, для которого более 1 событие имело бы смысл на стороне клиента, как бы это сделать? Должен ли я затем передавать информацию о том, какое событие нужно запустить в eventargs при вызове doPostBack? – user107986

ответ

0

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

public class LinkButtonWithClack : LinkButton 
{ 
    private const string ClackMarker = "Clack"; 
    public bool ClackMode { get; set; } 
    protected override PostBackOptions GetPostBackOptions() 
    { 
     var options = base.GetPostBackOptions(); 
     if (ClackMode) 
     { 
      // That's how you specify the event argument for __EVENTARGUMENT 
      options.Argument = ClackMarker; 
     } 
     return options; 
    } 

    public event EventHandler Clack; 

    protected override void RaisePostBackEvent(string eventArgument) 
    { 
     if (eventArgument == ClackMarker) 
     { 
      this.OnClack(EventArgs.Empty); 
     } 
     else 
     { 
      base.RaisePostBackEvent(eventArgument); 
     }   
    } 

    protected virtual void OnClack(EventArgs e) 
    { 
     if (Clack != null) 
     { 
      Clack(this, e); 
     } 
    } 
} 

В этом примере создается новый серверный элемент управления, LinkButtonWithClack. Этот элемент управления наследуется от серверного элемента управления LinkButton и имеет дополнительное событие, Clack. Если вы установите свойство ClackMode в true, он начнет генерировать Clacks вместо кликов.

ли и событие щелчок или погремушка передается вторым аргументом в doPostBack:

<a id="MainContent_LinkButtonWithClack1" 
href="javascript:__doPostBack(&#39;ctl00$MainContent$LinkButtonWithClack1&#39;,&#39;Clack&#39;)"> 

Сервер затем проверяет содержимое его и вызывает Clack событие, если он видит «Clack».

Конечно, вы вряд ли получите от LinkButton, я использую его только как пример, потому что вы это сделали. Вероятно, вы будете внедрять серверный контроль с нуля. При этом, пожалуйста, принесите все свои знания по созданию управления сервером или прочитайте, если у вас его нет - вам это понадобится.

В качестве дополнительной заметки в этот день легче найти помощь с asp.net mvc, чем с помощью webforms, так как последний старше и все меньше и меньше людей используют его. Если у вас есть какие-либо слова в выборе технологии, я бы выбрал asp.net mvc поверх webforms практически для чего угодно.

1

ASP.NET Web Forms всегда создает форму, которая включает все элементы управления на странице. Всякий раз, когда пользователь нажимает элемент управления на странице, которая запускает событие на сервере, то, что происходит за кулисами, заключается в том, что форма отправляется на сервер. Вместо того, чтобы делать простой POST, сообщение выполняется клиентской стороной __doPostback, которая получает два параметра: eventTarget и eventArgument. Первый имеет идентификатор элемента управления, который запускает обратную передачу, а второй содержит дополнительную информацию.Параметры этих параметров копируются в два скрытых поля в форме, которые размещаются вместе с остальными элементами формы.

После того, как на сервере значения в этих элементах управления можно прочитать, чтобы определить, какое событие будет поднято. Они могут быть прочитаны с помощью доступа к Request["__EVENTTARGET"]; и Request["__EVENTARGUMENT"];

Вы можете прочитать SO Q & A, и связанные страницы, чтобы узнать больше об этом: How to use __doPostBack()

Рамки ASP.NET упрощает работу, исследуя эти значения , и ищет элемент управления, идентификатор которого соответствует __EVENTTARGET, и реализует IPostBackEventHandler. Чтобы узнать больше об этом, вы должны прочитать: Server Event Handling in ASP.NET Web Forms Pagess.

Помимо событий с обратной передачей, есть также «события изменения». Эти события поднимаются путем сравнения исходного значения элемента управления, когда оно было отправлено в браузер, и значения, размещенного в этом элементе управления. Например, TextBox имеет событие TextChanged. Чтобы определить, нужно ли инициировать событие, сервер выдает исходное значение элемента управления из состояния представления (скрытое поле, которое было отправлено в браузер, с состоянием всех элементов управления с красным цветом, включая их значения) и сравнивает его с выведенное значение, при необходимости инициируя событие. Аналогично IPostBackEventHandler реализация IPostBackDataHandler позволит платформе искать элементы управления, которые должны обрабатывать такие события.

Вы также должны понимать жизненный цикл страницы, чтобы узнать, что происходит на сервере, и в каком порядке: When to wire up event handlers asp.net

+0

Спасибо за отличный обзор всего механизма! На самом деле, я спрашивал, что, если один пользовательский элемент управления может вызывать более одного события на стороне клиента. Клиентский код отправляет только идентификатор элемента управления, который запускал событие, не указав, какое событие произошло (потому что, вероятно, все стандартные элементы управления, которые клиент может запустить только 1 событие в своем браузере). Так, например, события на кнопке могут нажимать на нее или помещать курсор мыши на нее. Единственный способ, о котором я могу думать, - отправить информацию о том, какое событие произошло в __EVENTARGUMENT. – user107986

+0

Да, ответ zespri объясняет, как это сделать. Это связано с реализацией «IpostBackEventHandler»: метод «RaisePostBackEvent» вызывается средой, потому что Target Target соответствует этому элементу управления. И аргумент события 'Clack' передается этому методу в' eventArgument'. Существует множество серверных элементов управления, которые имеют несколько разных событий. Хорошими примерами являются сетка или элементы управления внутри сетки. Я знаю, что мой ответ слишком обширен, но если у вас есть время его прочитать, у вас будет гораздо более четкое представление о том, как работает ASP.NET Web Forms. – JotaBe

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