2010-09-27 72 views
0

我有结合的一组数据的中继器。在该中继器与用于更新各种控制,删除的列,等等,这些都是它触发一个onclick事件,如“DeleteRecord”图像按钮。这一切确实是火一个存储过程,传递记录的ID从对象的CommandArgument删除。从ASP.NET直放站项目删除 - 删除错误...?

这个奇妙的作品...除了一个相当严重的问题。一旦删除记录,如果刷新页面,则第一个删除记录过去的记录被删除。

比如......如果我有4条

 
1 Record1 
2 Record2 
3 Record3 
4 Record4 

,我删除记录2 ...页面将重新加载与(这是罚款):如果

 
1 Record1 
3 Record3 
4 Record4 

...然后我点击刷新...

 
1 Record1 
4 Record4 

我认为这是因为错误删除的对象(r​​ecord3)现在与第th e旧对象曾经是和.net因此不知道其差异,页面刷新并触发onlick事件,抓取新对象的命令参数并根据从新对象的命令参数获得的ID删除。

这显然是一个巨大的问题,如果客户这样做,它会错误地摧毁数据,我在这里输了。

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

下面的代码为了方便...

编辑在它周围包装了一个LinkBut​​ton,因为我在这里也有一些jQuery代码,它会停止页面执行以等待用户确认。按“ok”继续页面执行。

<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(); 
     } 
    } 

希望你们能给予的任何反馈。

+0

感谢编辑,奥德。 – Mark 2010-09-27 20:31:45

+0

我试过亚当的解决方案,它做同样的事情。然而,我应该指出,我不得不即兴创作,但它不应该在代码的执行上有所作为。我将更新上面的代码以反映新情况。 – Mark 2010-09-27 20:56:03

回答

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删除,而不是依赖于位置元素在你的中继器。

+0

感谢Adam的回应。不幸的是它做同样的事情。 – Mark 2010-09-27 20:55:04

+0

我已经完成了这一点,我从来没有遇到过问题。事实上,我只是建立了一个简单的例子,它的工作正确。代码中的其他内容会导致您的问题。 – 2010-09-27 21:12:17

+0

另外请注意,您可以将Response.Redirect始终返回到同一页面以避免任何刷新问题。 – 2010-09-27 21:15:39

1

您需要按照邮政重定向消息获取模式[1]

基本上显示数据,以命令的请求,并重定向回显示数据,不显示更新的响应请求。任何刷新将重新请求中的数据未再进行后

亚当

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

+0

+1 - 我也用了很多。 – 2010-09-28 15:42:45