ClientScript.RegisterForEventValidation и __doPostBack()

Я пытаюсь зарегистрировать некоторые кнопки для регистрации событий, потому что я продолжаю получать «Недопустимый аргумент обратной передачи или обратного вызова». Поскольку я передаю события кнопок вручную через __doPostBacks() из-за проверки на стороне клиента, я думаю, что это как-то связано с этим.

Я переопределил Render для использования RegisterForEventValidation следующим образом:

protected override void  Render(HtmlTextWriter writer)
{
    ClientScript.RegisterForEventValidation(btnNuevo.UniqueID);
    ClientScript.RegisterForEventValidation(btnBorrar.UniqueID);
    ClientScript.RegisterForEventValidation(btnEditar.UniqueID);
    ClientScript.RegisterForEventValidation(btnAlquilar.UniqueID); 
    base.Render(writer);
}

Но __doPostBacks на странице .aspx на стороне клиента записываются так:

...
__doPostBack('<%= btnNuevo.UniqueID %>', "");
...
__doPostBack('<%= btnBorrar.UniqueID %>', selected.childNodes[0].innerText);
...
__doPostBack('<%= btnEditar.UniqueID %>', index);
...
__doPostBack('<%= btnAlquilar.UniqueID %>', indexaux);

где selected.childNodes[0].innerText, index и indexaux являются строками. Это все еще вызывает это исключение.

Я знаю, что существует перегрузка RegisterForEventValidation, когда вы передаете ему ключ для элемента управления и аргументы.

Дело в том, что я не знаю, как это написать. Я не должен заранее знать, каким будет аргумент, поскольку selector, index и indexaux зависят от взаимодействия пользователя со страницей (а именно, выбора строки в GridView). Единственные примеры, которые я нахожу, это те, где аргумент всегда один и тот же, поэтому они просто пишут RegisterForEventValidation("nameOfControl", "XXXX"), где "XXXX" — фиксированная строка.

Любые идеи относительно того, как написать это, или если это не проблема?

Спасибо.


person Heathcliff    schedule 13.04.2012    source источник
comment
Зачем вообще нужно вызывать __doPostBack вручную для проверки на стороне клиента. Может быть, проще спросить, как использовать валидаторы ASP.NET с вашей валидацией клинта. Кроме того, я не понимаю, почему вызов __doPostBack должен вызывать недопустимый аргумент обратной передачи или обратного вызова. Источник этой ошибки где-то в другом месте. Вы меняете не кнопки на стороне клиента, а другие элементы управления, поэтому вам необходимо зарегистрировать их и их допустимые значения (которые ASP.NET не знает).   -  person Tim Schmelter    schedule 14.04.2012
comment
Ситуация выглядит следующим образом: вызов функции кода из javascript, которая может вернуть другой javascript">stackoverflow.com/questions/10126274/. Я полагал, что проблема заключается в настройках кнопок для событий, которые должны сначала вызывать функцию Javascript, затем функцию C #, и страница не знает или не распознает это. Это или проблема с тем, КАК изменяется GridView (потому что кнопка, которая добавляет в него новый регистр, работает нормально, а та, которая редактирует регистр, вызывая тот же ModalPopup и делая практически то же самое, выдает исключение Invalid Postback) .   -  person Heathcliff    schedule 15.04.2012


Ответы (1)


Я не знаю, настроены ли вы на этот подход, но вы можете просто установить EnableEventValidation в false в директиве страницы:

<%@ Page Language="C#" EnableEventValidation="false" ... %>
person James Johnson    schedule 13.04.2012
comment
Я предполагаю, что это то, чего на самом деле хочет избежать OP, иначе он бы спросил, как предотвратить ошибку, а не как правильно использовать RegisterForEventValidation. - person Tim Schmelter; 14.04.2012
comment
@TimSchmelter: Возможно, ты прав. Я просто решил представить это как вариант, если ОП не знал, что его можно отключить. - person James Johnson; 14.04.2012
comment
Нет, Тим Шмельтер прав: я пытаюсь не отключать EventValidator страницы. - person Heathcliff; 15.04.2012