Повторитель с кнопками не запускает OnItemCommand, даже если DataBind не происходит, когда IsPostBack истинен

У меня есть кнопка изображения в Repeater, которая находится в User Control, и я не могу запустить событие 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">
 </asp:imagebutton></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;
 }
 }
2 ответа

Я нашел причину, почему это происходит в ответе на этот вопрос: почему ItemCommand не запускается на My Repeater

Оказывается, что по какой-то причине функция Page DataBind недействила элементы управления ретрансляторами, не переходя через функцию повторителя OnItemDataBound во второй раз.


Вместо этого попробуйте использовать этот код:

<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">
 </asp:imagebutton></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... ... Invalid postback or callback argument. Event validation is enabled using... ошибки, это скорее всего означает, что вы где-то повторно привязываете ретранслятор до того, как ibRemove_Click(...) будет поднято.

licensed under cc by-sa 3.0 with attribution.