首页 > 解决方案 > 如何避免 asp:UpdatePanel 重复我的内容?

问题描述

我正在创建一个网页,该网页每 5 秒刷新一次以显示还剩多少订单。问题是刷新后,我的内容开始重复。在这里,我的问题简介:我正在展示: Order Offline : 1 / Order Online : 0. 刷新后,它将是: Order Offline : 11 / Order Online : 00. 我使用 withasp:UpdatePanel Triggersasp:Timer事件刷新页面

我试过用谷歌搜索答案,大多数情况下我通过设置ViewStateto找到了答案,Disabled我也试图改变UpdateModeConditional

这是我的代码片段:

<body>
    <form id="form1" runat="server">
        <asp:ScriptManager runat="server" ID="ScriptManager1" />
        <asp:Timer ID="Timer1" runat="server" Interval="5000"></asp:Timer>
        <div class="row">
            <div class="col-sm-2">
                <asp:ImageButton ImageUrl="image.png" Width="170" ID="ClsBtn" runat="server" />
            </div>
            <div class="col-sm-4" style="text-align: right;">
                <span id="date" style="font-size:10px; font-weight: 900;"></span>
                <span id="time" style="font-size:10px; font-weight: 900;"></span>
            </div>
            <div class="col-sm-4" style="text-align: right;">
                <asp:UpdatePanel ID="upTQ" runat="server">
                    <Triggers><asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" /></Triggers>
                    <ContentTemplate>
                        <span style="font-size: 15px; font-weight: 900;">OFFLINE : <asp:PlaceHolder runat="server" ID="phTotalQueue" /> / ONLINE : <asp:PlaceHolder runat="server" ID="phTotalQueueM" /></span>
                    </ContentTemplate>
                </asp:UpdatePanel>
            </div>

这是我背后的代码:

phTotalQueue.Controls.Add(New LiteralControl("" & dtTO.Rows(0).Item("TotalOrderOffline") & ""))
phTotalQueueM.Controls.Add(New LiteralControl("" & dtTO2.Rows(0).Item("TotalOrderOnline") & ""))

我希望输出Order Offline : 1 / Order Online : 0.没有重复的内容。

标签: asp.netvb.netwebforms

解决方案


让我们首先了解会发生什么:您的页面是在服务器上生成的,发送到浏览器,在那里显示它,然后,每次刷新时,服务器都会被请求,此时,a分别LiteralControl添加到phTotalQueuephTotalQueueM。每次运行时,已经存在于phTotalQueue和中的控件phTotalQueueM将分别保留在那里,显示旧值,但正在生成一个新的此类控件,显示旧值之外的新值。我想建议你确保你的 s 中有一个可识别LiteralControlUpdatePanel,有一个ID

                <asp:UpdatePanel ID="upTQ" runat="server">
                    <Triggers><asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" /></Triggers>
                    <ContentTemplate>
                        <span style="font-size: 15px; font-weight: 900;">OFFLINE : <asp:PlaceHolder runat="server" ID="phTotalQueue"><asp:Literal ID="phTotalQueueText" runat="server"></asp:Literal>
</asp:PlaceHolder> / ONLINE : <asp:PlaceHolder runat="server" ID="phTotalQueueM"><asp:Literal ID="phTotalQueueMText" runat="server"></asp:Literal></asp:PlaceHolder></span>
                    </ContentTemplate>
                </asp:UpdatePanel>

现在,由于您有可识别LiteralControl的实例,让我们更改代码隐藏:

phTotalQueueText.Text = "" & dtTO.Rows(0).Item("TotalOrderOffline") & ""

phTotalQueueMText.Text = "" & dtTO2.Rows(0).Item("TotalOrderOnline") & ""

或者,您可以从您的 s 中删除旧控件UpdatePanel,或者找到它们并修改它们的Text属性,但这些都是 hacky 方式,我建议使用可识别标签。


推荐阅读