Два типа событий обратной передачи

2


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

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

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


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

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


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


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

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


Благодарю вас

  • 0
    На какие статьи вы ссылаетесь?
Теги:
events
gridview
postback

3 ответа

1

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

Попробуйте поместить это в форму:

   <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

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

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

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

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

0

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

свойство autopostback просто позволяет сайту знать обратный вызов после того, как произойдет какое-либо изменение, будь оно изменено, выбрано indexchanged, checkedchanged и т.д., если свойство autopostback не установлено в true, эти события не будут выполняться.

  • 1
    Насколько я знаю, даже если свойство autopostback установлено в false, события TextChanged, SelectedIndexChanged и т. Д. Будут происходить, тем не менее, после публикации страницы обратно
  • 0
    нет, событие не сработает, поскольку страница не отправляет сообщение назад в результате вызова элемента управления для возврата. попробуйте: создайте текстовое поле, определите событие «ontextchanged» с некоторым кодом, но не устанавливайте для свойства autopostback значение true. Ваш онтекстовый код никогда не запустится. поверьте мне, я слишком часто сталкиваюсь с этой ошибкой в своем собственном коде;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню