Два типа событий обратной передачи - PullRequest
2 голосов
/ 28 мая 2009


1) Я нашел две статьи, каждая из которых по-разному классифицирует два типа событий обратной передачи:

Один ресурс сообщает, что двумя типами событий обратной передачи являются Измененное событие (где элементы управления реализуют IPostbackDataHandler), которое запускается при изменении данных между обратными передачами, а затем Повышенные события (где элементы управления реализуют IPostbackEventHandler), которые вызываются серверными элементами управления по любой причине, которую элемент управления считает нужным

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


а) Какая категоризация правильная?

б) Если вторая статья была правильной, то если элемент управления TextBox имел AutoPostBack = «true», то не должен ли TextChanged также считаться событием немедленного ответа?


2) Когда страница отправляется обратно на сервер из-за каких-либо действий пользователя, , а затем на этапе обработки событий , ASP.NET вызывает события всех элементов управления, чьи данные были изменены с момента последней обратной передачи. Событие, которое фактически вызвало обратную передачу (например, событие Click), возникает в последний раз


а) Но что если пользователь, выбравший строку в GridView, вызвал обратную передачу? Когда GridView вызывает обратную передачу из-за выбора строки, тогда, в отличие от более простых элементов управления (таких как TextBox или Button), эта обратная передача заставляет GridView запускать не одно, а несколько событий на стороне сервера на этапе обработки события (SelectedIndexChaning и SelectedIndexChanged).

Какие из этих событий GridView рассматриваются ASP.NET как те, которые вызвали обратную передачу?


спасибо

Ответы [ 3 ]

1 голос
/ 29 мая 2009

Событие SelectedIndexChanged (в списке) и событие TextChanged (в текстовом поле) будут запускаться при обратной передаче, даже если свойство Autopostback имеет значение false.

Попробуйте указать это в форме:

   <asp:ListBox runat="server" ID="test" 
        onselectedindexchanged="test_SelectedIndexChanged">
<asp:ListItem >number1</asp:ListItem>
 <asp:ListItem >number2</asp:ListItem>     
</asp:ListBox>

<asp:TextBox runat="server" ID="text" ontextchanged="text_TextChanged" />
<asp:Button runat="server" Text="Click Me" />

и это в коде позади:

 protected void test_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write("SelectedIndexChanged");
    }

    protected void text_TextChanged(object sender, EventArgs e)
    {
        Response.Write("TextChanged");
    }

Затем запустите его, измените выбранный элемент, введите текст и нажмите кнопку - оба события сработают. Вы можете увидеть последовательность событий, используя Reflector. Для текстового поля метод RaisePostDataChangedEvent:

 protected virtual void RaisePostDataChangedEvent()
{
    if (this.AutoPostBack && !this.Page.IsPostBackEventControlRegistered)
    {
        this.Page.AutoPostBackControl = this;
        if (this.CausesValidation)
        {
            this.Page.Validate(this.ValidationGroup);
        }
    }
    this.OnTextChanged(EventArgs.Empty);
}
0 голосов
/ 28 мая 2009

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

Итак, что касается 1b, когда AutoPostBack = true, я полагаю, что он просто устанавливает событие javascript onchange для выполнения обратного вызова. После запуска обратной передачи страница обнаруживает, что текстовое поле изменилось, и запускает измененное событие. Таким образом, это все еще не поднятое событие. (Я могу ошибаться, но это мое понимание.)

Событие Raise будет вызвано в методе RaisePostBack элемента управления (требуется IPostBackEventHandler), которое происходит после цикла загрузки страницы и запуска каждого события изменения.

Под капотом обратная передача может происходить одним из двух способов: путем отправки формы (asp: кнопка с поведением отправки) или с помощью вызова _doPostBack javascript (происходит в элементах управления, где AutoPostBack = true или когда вы делаете вызов напрямую используя Page.ClientScript).

0 голосов
/ 28 мая 2009

SelectedIndexChanging вызывается первым и обычно там, где я делаю какие-либо обновления. SelectedIndexChanged происходит ПОСЛЕ SelectedIndexChanging, поэтому технически страница видит SelectedIndexChanging как событие, вызвавшее обратную передачу. Помните, что постбэк также вызывает весь жизненный цикл страницы от Init до Page_Load к вашему событию.

свойство autopostback просто сообщает сайту о выполнении обратной передачи после любого изменения, будь то текстовое изменение, selectedindexchanged, checkgged и т. Д. Если для свойства autopostback не установлено значение true, эти события не произойдут.

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