【问题标题】:Linked Button inside grid view causing full post back when using update panel with grid view使用带有网格视图的更新面板时,网格视图内的链接按钮会导致完全回发
【发布时间】:2021-04-04 02:20:19
【问题描述】:

更新面板外有一个按钮,该按钮的点击事件绑定了网格视图。

网格视图位于更新面板内,并且网格视图内有一个链接按钮。

链接按钮导致完整的回帖,我在网上查看并尝试了不同的方法,但到目前为止没有运气。

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

<table>
<tr>
    <td>
        <asp:UpdatePanel ID="ContentUpdatePanel" runat="server">
            <ContentTemplate>
                <asp:GridView ID="gvMasterData" runat="server" AutoGenerateColumns="false" Width="200px" class="display">
                    <Columns>
                        <asp:TemplateField HeaderText="registration date" ItemStyle-Width="50">
                            <ItemTemplate>
                                <asp:Label ID="lblRegistrationDate" runat="server" Text='<%# Eval("registration_date") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="completed" ItemStyle-Width="50">
                            <ItemTemplate>
                                <asp:LinkButton Text='<%# Eval("completed") %>' ForeColor="Black" Font-Underline="false" runat="server" CommandName="Completed" CommandArgument="<%# Container.DataItemIndex %>" /> </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="pending" ItemStyle-Width="50">
                            <ItemTemplate>
                                <asp:LinkButton ID="MarkAsCompleteButton" Text='<%# Eval("pending") %>' ForeColor="Black" Font-Underline="false" runat="server" CommandName="Pending" CommandArgument="<%# Container.DataItemIndex %>" /> </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </ContentTemplate>
        </asp:UpdatePanel>
    </td>
</table>

代码背后

private void gvMasterData_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton;
    ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb);
  }
}

【问题讨论】:

  • 更新面板内的更新确实会导致表单加载命令每次触发 - 总是如此!这就是我们所说的部分回发。你确定你在这里看不到部分帖子吗?更新面板肯定会导致回发(他们总是这样做)。只是一个问题,这是一个完整的页面回帖还是部分回帖。我怀疑您看到的是回发 - 但我们总是这样做并且总是使用更新面板。主要区别在于,在这些部分回发中,您的代码只能更新/更改该窗格内的控件 - 而不是整个页面。

标签: c# asp.net updatepanel postback


【解决方案1】:

【讨论】:

  • 我的代码和您分享的链接上接受的答案没有任何区别。
  • 一个不同之处在于 updatepanel 定义“”childrenastriggers 参数
  • 或在另一个回复中他们建议触发gridview:“
  • 可能缺少的另一件事是更新面板上的更新模式。尝试使用始终模式。
【解决方案2】:

当您使用更新面板时,标准网页生命周期就会发生。这就是我们所说的部分回发。

因此,表单加载事件和所有标准 Web 表单事件附近都会触发。

唯一的区别是在这些部分回发中,代码存根(代码隐藏)只能修改面板内部的控件 - 而不是外部的控件。面板中的代码当然可以抓取/使用/查看和使用面板外的控件,但是这些值会有些“静态”或更清楚,当自上一个完整页面以来呈现整个页面时,这些值将是相同的回帖。

那么,您对看到回帖感到困惑或惊讶吗?你会的,你会的!

因此,也许您会看到回帖(您会并且会这样做)。但是,该回发不是整页回发。在更新面板内触发的任何按钮或事件都会导致回发 - 但我们称之为部分回发。

因此,大多数网页标准事件都会触发 - 包括加载事件。如前所述,这里唯一的区别是这些部分回发仅将更新面板内的更新内容(而不是整个页面)发送到服务器。

因此,您当然在所有情况下都会看到诸如加载火灾之类的事件。并且当该面板内的存根代码运行时,作为正常的操作过程,您只能使用后面的代码处理和修改该面板内的控件。如果该代码修改了面板之外的控件,那么在此处发生的经典标准“往返”中不包括更新面板之外的那些控件。因此,您不能也不会在运行的代码中看到反映在面板外部控件中的更改。

但是,当使用更新的面板时,确实会发生良好的老式往返,只是只有面板内的控件和东西才能进行这种经典的往返 - 而不是整个页面。

所以更新面板会并且会导致回发,但它们被认为是部分回发。

当然,更新面板确实会导致回发 - 但它只是部分回发。所有经典的往返操作都在此处发生 - 与整页回发相同,但仅限于更新面板 - 而不是整个页面。

因此,不清楚您是否“想知道”为什么会看到回帖(您会并且确实会)。 或者,如果您实际上看到的是一整页的回帖。所以零惊喜在这里触发了回发(确实发生了)。那么唯一的问题是您看到的回帖是一个完整的页面(不应该发生),或者您只是看到一个页面回帖是部分的?

如前所述,您将看到面板内运行的事件的回发。因此,像页面加载这样的正常操作会在使用更新面板时触发。

换句话说,更新面板代码和触发器的整个标准页面往返确实发生了。这是发生在这里的标准经典往返。如前所述,唯一的区别是此类往返仅包括面板内部的内容,因此不应触摸或刷新页面上的其他控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多