从ASP.NET Repeater项删除 - 错误删除...?

时间:2010-09-27 20:27:45

标签: c# asp.net repeater

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

这非常有效...除了一个相当大的问题。删除记录后,如果刷新页面,则删除第一个删除记录的记录将被删除。

例如......如果我有4条记录

1 Record1
2 Record2
3 Record3
4 Record4

我删除了记录2 ...页面重新加载(很好):

1 Record1
3 Record3
4 Record4

...如果我再点击刷新...

1 Record1
4 Record4

我认为这是因为错误删除的对象(r​​ecord3)现在与旧对象处于同一层次结构中,因此.net因此不知道差异,页面刷新并触发onlick事件,抓取输出新对象的命令参数,并根据从新对象的命令参数获取的ID进行删除。

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

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

为方便起见,

以下代码...

编辑在它周围包含一个LinkBut​​ton因为我在这里也有一些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();
        }
    }

非常感谢大家提供的任何反馈。

2 个答案:

答案 0 :(得分:4)

改为使用ItemCommand eventCommandName / CommandArgument

<!-- 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
    }
} 

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

答案 1 :(得分:1)

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

基本上显示数据,接受命令请求并重定向回显示数据,不显示响应帖子的更新。任何刷新都会重新请求数据重新执行帖子

亚当

[1] http://en.wikipedia.org/wiki/Post/Redirect/Get