текстовое поле дважды запускает событие TextChanged и двойную обратную передачу с прерыванием первого статуса обратной передачи

У меня есть текстовое поле availableItemsFilterTextBox, предназначенное для предоставления данных фильтрации для представления сетки availableItemsGridView.

<asp:TextBox runat="server" ID="availableItemsFilterTextBox" AutoPostBack="True" OnTextChanged="availableItemsFilterTextBox_TextChanged"></asp:TextBox>

Представление сетки availableItemsGridView находится внутри:

  1. UpdatePanel и с UpdateMode, установленным на «Conditional» и Trigger, установленным на событие TextChanged,
  2. и TabControl с AutoPostBack = "true"

    <ajaxToolkit:TabContainer runat="server" ID="patternTabContainer" ActiveTabIndex="0" AutoPostBack="false"
    OnActiveTabChanged="Tabs_ActiveTabChanged">
    <ajaxToolkit:TabPanel runat="server" ID="availableItemsTabPanel" meta:resourcekey="itemSelectionPanelResource">
        <ContentTemplate>
    
            <asp:UpdatePanel ID="availableItemsUpdatePanel" runat="server" UpdateMode="Conditional">
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="availableItemsFilterTextBox" EventName="TextChanged" />
                </Triggers>
                <ContentTemplate>
                    <asp:Panel ID="Panel1" runat="server" ScrollBars="Auto" Style="max-height: 400px;
                        margin: 5px 5px 5px 5px;">
                        <asp:GridView ID="availableItemsGridView" runat="server" CssClass="dataGrid" ShowHeaderWhenEmpty="True"
                            DataKeyNames="skuid,sku_desc,cat_desc,cls_desc" UseAccessibleHeader="False"
                            AutoGenerateColumns="False" EmptyDataText="No data available qwe123."
                            AllowPaging="True" AllowSorting="True" OnPageIndexChanging="availableItemsGridView_PageIndexChanging"
                            OnSorting="availableItemsGridView_Sorting">
    

Когда текст изменяется в availableItemsFilterTextBox, нет разницы, как - он теряет фокус или нажимается Enter, обратная передача выполняется дважды, а событие TextChanged также запускается дважды.

На панели обновлений определен триггер

<asp:AsyncPostBackTrigger ControlID="availableItemsFilterTextBox" EventName="TextChanged" />

В firebug я вижу пару запросов. первый из них находится в состоянии «Прервано»

Я экспериментировал с самой страницей, установив AutoEventWireup="false" и разместив неявный вызов «Page_Load» в теге формы <form id="form2" runat="server" onload="Page_Load" >. Я подумал, что это могло быть причиной двойной обратной передачи. Но безуспешно ...

Я попытался сохранить текстовое значение текстового поля в ViewState во время первой обратной передачи, а затем сравнить его со значением из viewState. Но, к сожалению, я понял, что между первой и второй обратной передачей я теряю данные из состояния просмотра.

Я попытался проделать тот же трюк с помощью сеанса.

                string vsFilter = (string)Session[AvailableItemsFilterTypes_Text];
            if (vsFilter != filter)
            {
                Session.Add(AvailableItemsFilterTypes_Text, filter);

                this.LoadAvailableItems();
            }

Но это только предотвращает загрузку данных, поскольку первый обратный вызов загружает данные, а затем прерывается без отрисовки. И вторая обратная передача не может вызвать LoadAvailableItems ();

Внутри LoadAvailableItems () я использую OracleAdapter, и мне нужно вызвать хранимую процедуру с выходным параметром OracleDbType.RefCursor. И чтобы включить сортировку и разбиение на страницы availableItemsGridView, мне нужно получить представление данных из набора данных. А затем привяжите его к availableItemsGridView. Насколько я понял, SqlDataSource недостаточно совместим для работы с Oracle ...

 DataView dataview = availableItemsDataSet.Tables[0].DefaultView;
            //dataview is required only to specify sorting
            dataview.Sort = sortExpression + sortDirection;

            availableItemsGridView.DataSource = dataview; 
            availableItemsGridView.PageIndex = NewPageIndex;

            availableItemsGridView.DataBind();

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


person adikas    schedule 15.11.2012    source источник
comment
мои дальнейшие исследования показали, что двойная обратная передача из TextBox - это поведение в Firefox, а в IE только одна обратная передача ...   -  person adikas    schedule 16.11.2012


Ответы (1)


Я бы рекомендовал использовать веб-методы и вызывать их с помощью jQuery. Вы увидите гораздо лучшую производительность и избежите двойной обратной передачи.

Вот хороший пример: http://weblogs.asp.net/craigshoemaker/archive/2008/11/07/using-jquery-to-call-asp-net-ajax-page-methods-by-example.aspx

person Rob    schedule 29.01.2013