【问题标题】:textbox fires TextChanged event twice and postback twise with first postback status aborted文本框两次触发 TextChanged 事件并两次回发,第一个回发状态中止
【发布时间】:2012-11-15 12:10:09
【问题描述】:

我有一个文本框availableItemsFilterTextBox,目的是为网格视图availableItemsGridView提供过滤数据。

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

网格视图availableItemsGridView放置在:

  1. UpdatePanel 和 UpdateMode 设置为“条件”和触发器 设置为 TextChanged 事件,
  2. 和带有 AutoPostBack="true" 的 TabControl

    <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" />

在萤火虫中,我可以看到几个请求。其中第一个处于“中止”状态

我已经通过设置AutoEventWireup="false" 并在表单标记&lt;form id="form2" runat="server" onload="Page_Load" &gt; 中对“Page_Load”进行隐式调用来试验页面本身。我在想这可能是两次回发的原因。但是没有成功...

我尝试在第一次回发期间将文本框文本值保存在 ViewState 中,然后将其与 viewState 中的值进行比较。但不幸的是,我发现在第一次和第二次回发之间,我从视图状态中丢失了数据。

我尝试使用 session.

                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 事件,以及第一个回发请求是如何以及在何处中止的?

【问题讨论】:

  • 我的进一步研究表明,来自 TextBox 的双重回发是它在 Firefox 中的行为,而在 IE 中只有一次回发...

标签: c# asp.net postback textchanged


【解决方案1】:

我建议使用 Web 方法并使用 jQuery 调用它们。您将看到更好的性能并避免双重回发。

这是一个很好的例子: http://weblogs.asp.net/craigshoemaker/archive/2008/11/07/using-jquery-to-call-asp-net-ajax-page-methods-by-example.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多