C# 正在从ASP.NET中继器项目中删除-删除错误。。。?

C# 正在从ASP.NET中继器项目中删除-删除错误。。。?,c#,asp.net,repeater,C#,Asp.net,Repeater,我有一个绑定一组数据的中继器。在这个中继器中有一个列,其中有各种用于更新、删除等的控件。这些是触发onclick事件(如“DeleteRecord”)的图像按钮。所有这一切只是触发一个存储过程,传入要从对象的CommandArgument中删除的记录的ID 这真是太棒了。。。除了一个相当大的问题。删除记录后,如果刷新页面,将删除第一条已删除记录所在的记录 例如。。。如果我有4张唱片 1 Record1 2 Record2 3 Record3 4 Record4 1记录1 2记录2 3记录3 4记

我有一个绑定一组数据的中继器。在这个中继器中有一个列,其中有各种用于更新、删除等的控件。这些是触发onclick事件(如“DeleteRecord”)的图像按钮。所有这一切只是触发一个存储过程,传入要从对象的CommandArgument中删除的记录的ID

这真是太棒了。。。除了一个相当大的问题。删除记录后,如果刷新页面,将删除第一条已删除记录所在的记录

例如。。。如果我有4张唱片

1 Record1 2 Record2 3 Record3 4 Record4 1记录1 2记录2 3记录3 4记录4 我删除了记录2。。。页面将重新加载(这很好):

1记录1 3记录3 4记录4 …如果我点击刷新

1 Record1 4 Record4 1记录1 4记录4 我假设这是因为错误删除的对象(record3)现在与旧对象位于同一层次位置,因此.net不知道差异,页面刷新并触发onlick事件,抓取新对象的命令参数,并根据从新对象的commandargument获得的ID进行删除

这显然是一个巨大的问题,如果客户这样做,就会错误地破坏数据,我在这里不知所措

有没有办法阻止这种事情发生?我不确定是否有更好的方法来做事情。如果没有,我需要某种方式来告诉页面不要执行事件,或者对照对象本身交叉引用要删除的对象的ID

为方便起见,请输入下面的代码

EDIT在其周围包装了一个LinkButton,因为我这里还有一些jquery代码,它会停止页面执行以等待用户确认。按“确定”继续页面执行

<asp:LinkButton ID="oDeleteLink" CssClass="oDeleteIcon" CommandName="Delete" CommandArgument='<%# Eval("iAccountID") %>' runat="server">
     <asp:ImageButton ImageUrl="/files/system/icons/trash-steel-16.png" ToolTip="Delete This Account" AlternateText="Delete" ID="oDeleteIcon" runat="server" />
</asp:LinkButton>

    protected void oAccounts_ItemCommand(Object Sender, RepeaterCommandEventArgs e) {
        if (e.CommandName == "Delete") {
            int ID = e.CommandArgument.ToString().Numeric();
            db.SPs.SpDeleteAccount(ID).Execute();
            UI.Confirm(uiBroadcast, "Account has been deleted", "300px");
            BindAccounts();
        }
    }

受保护的无效OAAccounts\u ItemCommand(对象发送方、RepeaterCommandEventArgs e){
如果(如CommandName==“删除”){
int ID=e.CommandArgument.ToString().Numeric();
db.SPs.SpDeleteAccount(ID.Execute();
UI.确认(uiBroadcast,“账户已删除”,“300px”);
BindAccounts();
}
}
如果你们能提供任何反馈,我将不胜感激

使用和/或替代:

这样,“删除”按钮本身就指示要删除的ID,而不是依赖中继器中的位置元素。

使用和/或:


这样,“删除”按钮本身就指示要删除的ID,而不是依赖中继器中的位置元素。

您需要遵循Post Redirect Get模式[1]

基本上显示数据,取命令请求并重定向回显示数据,不显示更新后的回复。任何刷新都将重新请求数据而不是重新执行post

亚当


[1]

您需要遵循Post重定向获取模式[1]

基本上显示数据,取命令请求并重定向回显示数据,不显示更新后的回复。任何刷新都将重新请求数据而不是重新执行post

亚当


[1]

谢谢您的回复,亚当。不幸的是,它也做同样的事情。我已经做了很多次了,我从来没有遇到过问题。事实上,我刚刚构建了一个简单的示例,它工作正常。代码中的其他内容导致了您的问题。请注意,您始终可以响应。重定向回同一页面以避免任何刷新问题。@Adam这是一个非常严重的错误,因此我认为现在将使用Response.Redirect方法,但这并不理想。你能帮我举个简单的例子吗?更好的是,把它拉上拉链,寄给我,这样我就可以知道哪里出了问题。非常感谢。谢谢你的帮助。这是一个非常简单的例子。它使用静态数据,并显示无论您在删除项后刷新的频率有多高,都会向服务器发送相同的命令arg(在事件处理程序中放置一个断点以证明这一点)。感谢您的响应。不幸的是,它也做同样的事情。我已经做了很多次了,我从来没有遇到过问题。事实上,我刚刚构建了一个简单的示例,它工作正常。代码中的其他内容导致了您的问题。请注意,您始终可以响应。重定向回同一页面以避免任何刷新问题。@Adam这是一个非常严重的错误,因此我认为现在将使用Response.Redirect方法,但这并不理想。你能帮我举个简单的例子吗?更好的是,把它拉上拉链,寄给我,这样我就可以知道哪里出了问题。非常感谢。谢谢你的帮助。这是一个非常简单的例子。它使用静态数据,并显示无论您在删除一个项目后刷新多长时间,都会向服务器发送相同的命令arg(在事件处理程序中放置一个断点以证明这一点)。我尝试了Adam的解决方案,它也做了同样的事情。然而,我应该指出,我必须临时做一点,但这不会对代码的执行产生影响。我将更新上面的代码以反映新的情况。我已经尝试了Adam的解决方案,它也做了同样的事情。然而,我应该指出,我必须临时做一点,但这不会对代码的执行产生影响。我将更新上面的代码以反映新的情况。
<asp:LinkButton ID="oDeleteLink" CssClass="oDeleteIcon" CommandName="Delete" CommandArgument='<%# Eval("iAccountID") %>' runat="server">
     <asp:ImageButton ImageUrl="/files/system/icons/trash-steel-16.png" ToolTip="Delete This Account" AlternateText="Delete" ID="oDeleteIcon" runat="server" />
</asp:LinkButton>

    protected void oAccounts_ItemCommand(Object Sender, RepeaterCommandEventArgs e) {
        if (e.CommandName == "Delete") {
            int ID = e.CommandArgument.ToString().Numeric();
            db.SPs.SpDeleteAccount(ID).Execute();
            UI.Confirm(uiBroadcast, "Account has been deleted", "300px");
            BindAccounts();
        }
    }
<!-- CommandArgument binding would be the same as whatever you are binding your ID label text value to -->
<asp:ImageButton 
    CommandName="Delete" CommandArgument='<%# Eval("ID") %>'
    ImageUrl="/files/system/icons/trash-steel-16.png"  
    ToolTip="Delete This Account" 
    AlternateText="Delete" CssClass="oDeleteIcon"  
    ID="oDeleteIcon" runat="server" /> 
void Repeater_ItemCommand(Object Sender, RepeaterCommandEventArgs e) {        
    if( e.CommandName == "Delete" ) {
        int id = e.CommandArgument.ToString().Numeric();

        db.SPs.SpDeleteAccount(id).Execute();
        // the rest of your code
    }
}