1

我在用户控件中的中继器中有一个图像按钮,当我单击它时无法触发 OnItemCommand 事件。它总是给出错误:“......无效的回发或回调参数。使用......启用事件验证”

当我将图像按钮更改为链接按钮时,它不会给我错误,但它仍然不会触发 OnItemCommand 函数。

我找到了一些其他相关的答案(例如How to process events from Buttons inside Repeaters?这 EnableEventValidation 是什么?)但他们都说,“确保你在 if(!Page.IsPostBack ) 堵塞。” 我已经这样做了,但这并没有什么不同。

这是转发器的标记:

   <asp:Repeater ID="rptExpenses" OnItemDataBound="rptExpenses_ItemDataBound" OnItemCommand="Button_Command" runat="server" >
   <ItemTemplate>
      <asp:ImageButton ID="ibDelete" ImageUrl="~/Images/delete.png" CommandName="Delete" runat="server" />
   </ItemTemplate>
   </asp:Repeater>

这是代码隐藏的一些摘录

  protected void Page_Load(object sender, EventArgs e) {
     if (!IsPostBack) {
        rptExpenses.DataSource = ExpenseIds;
        rptExpenses.DataBind();
     }
  }

  protected void rptExpenses_ItemDataBound(object sender, RepeaterItemEventArgs e) {
     if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) {
        var ibDelete = (ImageButton)e.Item.FindControl("ibDelete");
        ibDelete.CommandArgument = e.Item.DataItem.ToString();
     }
  }

  protected void Button_Command(object sender, EventArgs e) {
     var btn = (IButtonControl)sender;
     switch (btn.CommandName) {
        case "Delete":
           //delete it
           break;
     }
  }
4

2 回答 2

0

我在这个问题的答案中找到了发生这种情况的原因:Why ItemCommand doesn't fire on My Repeater

事实证明,由于某种原因,Page 的 DataBind 函数使中继器的控件无效,而没有第二次通过中继器的 OnItemDataBound 函数。

于 2013-07-08T16:41:59.150 回答
0

尝试改用此代码:

<asp:Repeater ID="rptExpenses" runat="server">
    <ItemTemplate>
        <asp:ImageButton ID="ibRemove" ImageUrl="~/Images/delete.png" runat="server"
            CommandName="Remove"
            CommandArgument='<%# Container.DataItem %>'
            OnCommand="ibRemove_Click"/>
    </ItemTemplate>
</asp:Repeater>

这在后面的代码中:

protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
        rptExpenses.DataSource = ExpenseIds;
        rptExpenses.DataBind();
    }
}
protected void ibRemove_Click(object sender, CommandEventArgs e)
{
    var btn = (IButtonControl)sender;
    switch (btn.CommandName)
    {
        case "Remove":
        //delete it, use btn.CommandArgument to find id to remove
        break;
    }
}

如果您仍然收到... Invalid postback or callback argument. Event validation is enabled using ...错误,则很可能意味着您在ibRemove_Click(...)引发事件之前在某个地方重新绑定了转发器。

于 2013-07-04T07:58:33.497 回答