Кнопка внутри ретранслятора не работает


У меня есть две кнопки внутри ретранслятора, и я пытаюсь получить к ним доступ из кода позади, но они не работают. Я получаю следующую ошибку:

Недопустимый аргумент postback или callback. Проверка событий включена с помощью in configuration или на странице. В целях безопасности эта функция проверяет, что аргументы для событий postback или callback исходят из серверного элемента управления, который первоначально их отображал. Если данные верны и как ожидается, используйте ClientScriptManager.RegisterForEventValidation метод для регистрации данных обратного или обратного вызова для проверки.

Я не понимаю, что означает эта ошибка и откуда она исходит. Вот мой код:
    <asp:Repeater ID="Repeater1" runat="server" 
        onitemdatabound="Repeater1_ItemDataBound1" 
        onitemcommand="Repeater1_ItemCommand" >
    <ItemTemplate>
    <table>
    <tr>


        <td><asp:Image ID="Image1" runat="server" /></td>
         <td><asp:Label ID="empnamelbl" runat="server" Text='<%# Eval("fullname") %>'></asp:Label></td>
        <td><asp:DropDownList ID="DropDownList1" runat="server">
        </asp:DropDownList></td>
        <td> <asp:Button ID="Button1" runat="server" Text="Present" CommandName="test1"  CommandArgument='<%# Eval("ID") %>' /> </td>
        <td><asp:Button ID="Button2" runat="server" Text="Absent"  CommandName="test2" CommandArgument='<%# Eval("ID") %>' /> </td>
        </tr>
        </table>
    </ItemTemplate>
    </asp:Repeater>

Код сзади:

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "test1")
    {
        Response.Write("hi");
    }
}
3 2

3 ответа:

Я смог решить ее с помощью свойства UseSubmitBehavior= "false"в кнопках.

Вот оно:

<asp:Button ID="Button2" UseSubmitBehavior="false" runat="server" Text="Absent"  CommandName="test2" CommandArgument='<%# Eval("ID") %>' />

Попробуйте установить EnableViewState="false" для ретранслятора. Безусловно, будут некоторые недостатки, но это сработало для меня.

Еще ниже приведены некоторые другие подходы, которые вы можете попробовать:

Если вы устанавливаете источник данных вашего ретранслятора в событии Page_Load.

Попробуйте обернуть код Page_Load внутрь if(!IsPostBack).

protected void Page_Load( object sender , eventArgs e)
{
            if(!IsPostBack)
       {
             // bind repeater , dropdownlist items ... here
       }

}

Также из Вашего сообщения об ошибке кажется, что параметр enableEventValidation=“true” присутствует либо на Вашей странице как:

<%@ Page EnableEventValidation="true" ... %>

Или в вашей сети.config:

<system.web>
   <pages enableEventValidation="true"/>
</system.web>

Некоторые предложения:

  1. Отключить eventvalidation. Легко сделать, но менее безопасно .ЭТО НЕ РЕКОМЕНДУЕТСЯ. Также читайте здесь чрезвычайно хорошую статью по этому вопросу: http://odetocode.com/blogs/scott/archive/2006/03/22/asp-net-event-validation-and-invalid-callback-or-postback-argument-again.aspx

  2. Если какой-либо метод на стороне клиента используется для установки изменений в элементах управления, то лучше использовать обратная передача и добавление или удаление элементов на стороне сервера. Пример: если элемент управления списком включает опции с номерами 1, 2 или 3 при отображении страницы, и если получен запрос на обратную передачу с указанием опции с номером 4, ASP.NET вызывает исключение.

Эта ссылка MSDN. тоже хорошо. Надеюсь, это поможет.

Из-за наличия образа, запущенного на сервере .. попробуйте использовать тег img вместо