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