javascript函数被asp.net中的回发覆盖

Posted

技术标签:

【中文标题】javascript函数被asp.net中的回发覆盖【英文标题】:javascript function overridden by post back in asp.net 【发布时间】:2014-08-27 08:01:34 【问题描述】:

我有一个嵌套网格视图,它通过以下 javascript 实现:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" >
    $("[src*=plus]").live("click", function () 
        $(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>")
        $(this).attr("src", "images/minus.png");
    );
    $("[src*=minus]").live("click", function () 
        $(this).attr("src", "images/plus.png");
        $(this).closest("tr").next().remove();
    );

gridview的定义方式如下:

<asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="false" CssClass="Grid"
    DataKeyNames="CustomerID" OnRowDataBound="OnRowDataBound">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <img alt = "" style="cursor: pointer" src="images/plus.png" />
                <asp:Panel ID="pnlOrders" runat="server" Style="display: none">
                    <asp:GridView ID="gvOrders" runat="server" AutoGenerateColumns="false" CssClass = "ChildGrid">
                        <Columns>
                            <asp:BoundField ItemStyle-Width="150px" DataField="OrderId" HeaderText="Order Id" />
                            <asp:BoundField ItemStyle-Width="150px" DataField="OrderDate" HeaderText="Date" />
                        </Columns>
                    </asp:GridView>
                </asp:Panel>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField ItemStyle-Width="150px" DataField="ContactName" HeaderText="Contact Name" />
        <asp:BoundField ItemStyle-Width="150px" DataField="City" HeaderText="City" />
    </Columns>
</asp:GridView>

为了获取子网格视图的数据,我需要在服务器端的父网格视图中选择行的文本。甚至进一步的处理需要两个网格视图的选定行的文本数据。为此,我尝试在 OnSelectedIndexChanged 函数中获取文本,但作为回发请求,折叠展开的行(即重置它)。

是否有不需要 javascript 并直接从服务器端创建嵌套 gridview 的解决方案?或者我可以获得数据服务器端但仍将展开的行保持为展开状态的任何其他解决方案。

【问题讨论】:

您可以尝试将expandedparentgrid的id或文本存储在hiddenfield中,并在回发后手动设置它们展开。 【参考方案1】:

您可以将嵌套的Gridview 控件放在更新面板中,以防止整个页面回发OnSelectedIndexChanged 事件。

    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">
    <asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="false" CssClass="Grid"
        DataKeyNames="CustomerID" OnRowDataBound="OnRowDataBound">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <img alt = "" style="cursor: pointer" src="images/plus.png" />
                    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                        <ContentTemplate>
                            <asp:Panel ID="pnlOrders" runat="server" Style="display: none">
                                <asp:GridView ID="gvOrders" runat="server" AutoGenerateColumns="false" CssClass = "ChildGrid">
                                    <Columns>
                                        <asp:BoundField ItemStyle-Width="150px" DataField="OrderId" HeaderText="Order Id" />
                                        <asp:BoundField ItemStyle-Width="150px" DataField="OrderDate" HeaderText="Date" />
                                    </Columns>
                                </asp:GridView>
                            </asp:Panel>
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField ItemStyle-Width="150px" DataField="ContactName" HeaderText="Contact Name" />
            <asp:BoundField ItemStyle-Width="150px" DataField="City" HeaderText="City" />
        </Columns>
    </asp:GridView>

【讨论】:

不,不工作,可能是因为外部网格必须在更新面板中。 OnSelectedIndexChanged 的控件放在哪里? 在每个 gridview(outer + inner) 上,因为我需要他们两个服务器上的文本。

以上是关于javascript函数被asp.net中的回发覆盖的主要内容,如果未能解决你的问题,请参考以下文章

asp.net:无效的回发或回调参数

使用 JavaScript 的 ASP.NET 回发

回发后,我的 JavaScript 函数在 ASP.NET 中不起作用

无效的回发或回调参数/无效的视图状态

回发前的 ASP.NET TreeView javascript

从 JavaScript 添加 asp.net 下拉列表项会导致页面回发错误