1

ユーザー コントロールにあるリピーターにイメージ ボタンがあり、クリックしても OnItemCommand イベントを発生させることができません。常に次のエラーが表示されます:「...無効なポストバックまたはコールバック引数。イベント検証は...を使用して有効になっています

画像ボタンをリンク ボタンに変更すると、エラーは発生しませんが、それでも OnItemCommand 関数は起動しません。

他の関連する回答をいくつか見つけました (たとえば、リピーター内のボタンからイベントを処理する方法は? そして、この 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

代わりに次のコードを使用してみてください。

<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 に答える