停止双重回发

Posted

技术标签:

【中文标题】停止双重回发【英文标题】:stop double postback 【发布时间】:2010-11-29 04:28:19 【问题描述】:

这就是我正在做的事情。我在我创建的 gridview 的标题行中创建了两个按钮。按钮是+page 和-page。当 -page 被击中时,我删除了分页,所有数据都在页面下,-page 消失了,+page 在那里。

我的问题来了当我点击 +page 时,我必须进行双重回发,因为我的一行数据消失了。我将在下面提供代码。我该怎么做才能解决这个问题??

Dim bttnrempag As New Button
    bttnrempag.ID = "bttnrempag"
    bttnrempag.Text = "      Paging"
    bttnrempag.CssClass = "bttnMinEG"
    bttnrempag.ValidationGroup = "alone"
    bttnrempag.Attributes.Add("onclick", "return Paging('1')")

    Dim bttnallowpag As New Button
    bttnallowpag.ID = "bttnallowpag"
    bttnallowpag.Text = "      Paging"
    bttnallowpag.ValidationGroup = "alone"
    bttnallowpag.CssClass = "bttnAddEG"
    bttnallowpag.Attributes.Add("onclick", "return Paging('0')")

------按钮的添加方式------ ------------------------

    Dim row As New GridViewRow(-1, -1, DataControlRowType.Separator, DataControlRowState.Normal)
    row.Cells.Add(cell)
    cell.Controls.Add(bttnrempag) '36
    cell.Controls.Add(bttnallowpag)

------------------------------------------ --------------------------------------------

function Paging(remove) 
    var gridView = $get('<%=Gridview1.ClientID %>');
    var txt2 = $get('<%=TextBox2.ClientID %>');
    if (remove == '1') 
        txt2.value = '1';
        __doPostBack('<%=UpdatePanel1.ClientID %>', '');
        return false;
    
    else 
        txt2.value = '0';
        __doPostBack('<%=UpdatePanel1.ClientID %>', '');
        return false;
    

已编辑

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate >
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AutoGenerateColumns="False" BackColor="White" BorderColor="#E7E7FF" 
            BorderStyle="None" BorderWidth="1px" CellPadding="3" 
            DataSourceID="SqlDataSource1" Font-Names="Comic Sans MS" Font-Size="XX-Small"
            Caption = '<table border=""  cellpadding="3" cellspacing="0" bgcolor="#4A3C8C"><tr><td style = "font-size:X-large;font-family:Arial CE;color:White"><b>Ordering/Receiving Log</u></td></tr></table>' 
            Font-Bold="True" PageSize="15" >
            <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />

            <Columns>
                      Bound Data
            </Columns>
            <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
            <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
            <EmptyDataTemplate>
            <head>
                <meta http-equiv="refresh" content="5;URL=/Corporate_newpo/ReceivingLog.aspx?">
            </head>
                <script type="text/javascript" >
                    var count = 6;
                    var counter = setInterval("timer()", 1000); //1000 will  run it every 1 second

                    function timer() 
                        count = count - 1;
                        if (count <= 0) 
                            clearInterval(counter);
                            //counter ended, do something here
                            return;
                        
                        $get("timer").innerhtml = "The Table will Reload in " + count + " secs";
                    
                </script>
                <asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Size="Large" 
                    ForeColor="#993333" Text="No Data was Found for the Selected Filter"></asp:Label><br /><br />
               <span id="timer" style="font-size:medium;color:blue"></span>
            </EmptyDataTemplate>
            <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
            <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
            <AlternatingRowStyle BackColor="#F7F7F7" />
            <PagerTemplate>
                <small 12px""="" style="font-size:xx-small; padding-right">Go To Page</small>
                <asp:DropDownList ID="ddlPageSelector" runat="server" AutoPostBack="true" 
                    Font-Size="XX-Small" Height="19px" Width="36px">
                </asp:DropDownList>
                <asp:ImageButton ID="btnFirst" runat="server" CommandArgument="First" 
                    CommandName="Page" SkinID="pagefirst" />
                <asp:ImageButton ID="btnPrevious" runat="server" CommandArgument="Prev" 
                    CommandName="Page" SkinID="pageprev" />
                <asp:ImageButton ID="btnNext" runat="server" CommandArgument="Next" 
                    CommandName="Page" SkinID="pagenext" />
                <asp:ImageButton ID="btnLast" runat="server" CommandArgument="Last" 
                    CommandName="Page" SkinID="pagelast" />
            </PagerTemplate>
            </asp:GridView>
        </ContentTemplate> 
    </asp:UpdatePanel>

如您所见,当一个或另一个被击中时,我将一个文本框设置为某个值,然后我将部分回发到该更新面板中的 Gridview。

【问题讨论】:

@Eric - 标签用于实际使用的东西。为了您的目的,asp.net 标签涵盖了 vb.net 和 c#。 【参考方案1】:

我怀疑这是因为您调用了“__doPostBack”方法。按钮的正常默认点击行为将执行异步回发,您可能让它再次执行。尝试删除它,看看效果如何。

【讨论】:

但是return false 他应该阻止默认行为。 嗯...显示更多代码怎么样?例如。如何在 UpdatePanel 中构建控件以及如何完成数据绑定。客户端“分页(删除)”功能除了给你一个文本框值的视觉线索外,并不是真正需要的。 好的。我为你添加了代码,我在听 - 你可能有一点意思。 我认为在这种情况下 return false 不会阻止回发。 __doPostBack 方法被显式调用,该方法又调用 theForm.submit()。页面已经提交,返回false不会取消此行为。 @Phaedrus 你是对的。但它只进行部分回发。不是完整的回发。但是是的 - 返回 false 是没有意义的。【参考方案2】:

您可以尝试将 Click 属性放在 RowDataBound 事件声明中的按钮上吗?

干杯。

【讨论】:

【参考方案3】:

试试这个,(我不知道你为什么使用 javascript):

bttnrempag.onclick += bttnrempag_Click; 

protected void bttnrempag_Click(object sender, EventArgs e)

    //handle the removal of paging or whatever.

【讨论】:

【参考方案4】:

尝试将您的 更改为常规 HTML 标签。

我之前遇到过这种很难诊断甚至更难解释的事情。请参阅 here 和 here 了解一些可能有帮助的错误行为。如果您有带有空白 src 属性的 标签,那么我提供的超链接可能会解释问题。如果您没有任何空白的 标签,请继续阅读我的工作。

在我的具体情况下,它只发生在某些服务器上(在某些客户端站点上)而不是其他服务器上,所以我找不到代码的任何具体问题。我的解决方法是将我的 更改为带有 javascript 点击事件的常规 标签,该事件会调用一个函数来执行回发,就像你的 Paging() 函数一样。

出于某种原因,我发现一个 的客户端 onclick 事件为 return:confirm('are you sure?');如果 confirm() 返回 false,则将停止回发,但是在手动调用 __doPostBack 后在 Paging() 函数中返回 false 的方式并不能始终阻止页面再次回发。

【讨论】:

您给出的链接指出了它发生的原因(但我不知道为什么它只会在某些服务器上......除非图像的路径无效或 ASP.NET 没有'无权访问图像...如果您在虚拟目录中开发但部署到 Web 应用程序根目录,则图像的路径一直无效。【参考方案5】:

您必须为您的 ImageButtons 提供图像。否则,呈现的 HTML 将产生一个 &lt;img src=""&gt; 标记,当它被呈现时,它会导致回发。试试看。

【讨论】:

【参考方案6】:

我找到了一个很好的解决方案,效果很好。它确实附加了它自己的处理程序,但我想这也可以修复。

using System.Linq;

private void GridView_OnItemDataBound(object sender, GridViewRowEventArgs e)

    if (e.Row.RowType == DataControlRowType.DataRow)
    
        var buttons = e.Row.Cells.OfType<DataControlFieldCell>().SelectMany(item => item.Controls.OfType<ImageButton>());
        foreach (ImageButton imageButton in buttons)
        
            var argument = imageButton.CommandName + "$" + imageButton.CommandArgument;
            imageButton.OnClientClick = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView, argument) + "; return false;";
        
    

【讨论】:

【参考方案7】:

请查看页面上呈现的 html:

每次都出现

<img src=""/>

对于某些浏览器,可能会发生双重回发...

为每个按钮设置一个默认的空白图像可以解决这个问题

<asp:ImageButton ImageUrl="~/Images/blank.gif"...>

无论如何,如果您在Page_Load 中放置一个断点并允许您识别导致回发的控件

,则可以在Immediate Window 中输入此命令
Page.Request.Params["__EVENTTARGET"];

【讨论】:

以上是关于停止双重回发的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 代码中通过 javascript 重置 Jquery 验证后停止回发

GridView 上的 jQuery 函数在页面回发后停止工作(鼠标悬停,单击)

如何使用javascript在asp.net上停止正在进行的回发(长时间运行)?

在数字字段中停止双重句点

除了卡片,Facebook机器人停止了回复

从 UpdatePanel 异步回发后,嵌入式 javascript 不起作用