Неверный аргумент обратной передачи или обратного вызова. Проверка события включена с помощью '<pages enableEventValidation = "true" />' - PullRequest
229 голосов
/ 23 октября 2008

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

Как мы можем это исправить?

Подробности ошибок ниже:

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
   System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
   System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
   System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433

Ответы [ 39 ]

177 голосов
/ 21 сентября 2010

У вас есть коды в ваших событиях Page_Load? если да, то, возможно, добавление следующего поможет.

if (!Page.IsPostBack)
{ //do something }

Эта ошибка выдается, когда вы нажимаете на команду и снова запускается Page_load, в нормальном жизненном цикле Page_Load -> Нажмите Command -> Page_Load (снова) -> Обработать событие ItemCommand

169 голосов
/ 23 октября 2008

Проблема в том, что ASP.NET не узнает об этом дополнительном или удаленном элементе списка. У вас есть несколько вариантов (перечислены ниже):

  • Отключить проверку событий (плохая идея, потому что вы теряете немного безопасности, которая приходит с очень небольшими затратами).
  • Используйте ASP.NET Ajax UpdatePanel. (Поместите список в панель обновлений и запустите обновление, если вы добавляете или удаляете список. Таким образом, viewstate и связанные с ним поля получают обновления, и проверка событий проходит.)
  • Забудьте на стороне клиента и используйте классическую обратную передачу, а также добавьте или удалите серверные списки элементов.

Надеюсь, это поможет.

39 голосов
/ 09 ноября 2008

У меня был опыт работы с DataGrid. Одним из столбцов была кнопка «Выбрать». Когда я нажимал кнопку «Выбрать» в любой строке, я получал это сообщение об ошибке:

"Недопустимый аргумент обратной передачи или обратного вызова. Проверка события включена с использованием в конфигурации или <% @ Page EnableEventValidation = "true"%> на странице. В целях безопасности эта функция проверяет, что аргументы для обратной передачи или события обратного вызова происходят от серверного элемента управления, который первоначально их представил. Если данные действительны и ожидаемы, используйте ClientScriptManager.RegisterForEventValidation для регистрации данных обратной передачи или обратного вызова для проверки. "

Я изменил несколько кодов, и наконец мне это удалось. Мой маршрут опыта:

1) Я изменил атрибут страницы на EnableEventValidation="false". Но это не сработало. (это не только опасно) по соображениям безопасности мой обработчик событий не вызывался: void Grid_SelectedIndexChanged(object sender, EventArgs e)

2) Я реализовал ClientScript.RegisterForEventValidation в методе Render. Но это не сработало.

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

3) Я изменил тип кнопки в столбце сетки с PushButton на LinkButton. Это сработало! ("ButtonType =" LinkButton "). Думаю, если вы сможете изменить свою кнопку на другие элементы управления, например" LinkButton ", в других случаях она будет работать правильно.

27 голосов
/ 29 октября 2008

Вы действительно хотите сделать 2 или 3, не отключайте проверку события.

Существуют две основные проблемы с добавлением элементов на стороне клиента asp: listbox.

  • Во-первых, это мешает проверке события. То, что вернулось на сервер, не то, что оно отправило.

  • Во-вторых, даже если вы отключите проверку событий, когда ваша страница будет опубликована обратно, элементы в списке будут перестроены из состояния просмотра, поэтому любые изменения, сделанные вами на клиенте, будут потеряны. Причина этого заключается в том, что asp.net не ожидает, что содержимое списка будет изменено на клиенте, он только ожидает выбора, поэтому он отбрасывает любые изменения, которые вы могли сделать.

Лучшим вариантом, скорее всего, будет использование панели обновления, как было рекомендовано. Другой вариант, если вам действительно нужно сделать это на стороне клиента, - это использовать старый <select> вместо <asp:ListBox> и хранить список элементов в скрытом поле. Когда страница отображается на клиенте, вы можете заполнить ее из разделения содержимого текстового поля.

Затем, когда вы будете готовы опубликовать его, вы заполняете содержимое скрытого поля из вашего измененного <select>. Затем, конечно, вам придется снова разделить это на сервере и что-то сделать со своими элементами, поскольку ваш выбор пуст, поскольку он вернулся на сервер.

В целом, это довольно громоздкое решение, которое я не очень рекомендую, но если вам действительно нужно вносить изменения в listBox на стороне клиента, оно работает. Однако я бы порекомендовал вам заглянуть в панель обновления, прежде чем идти по этому пути.

17 голосов
/ 19 ноября 2009

У меня была такая же проблема с Repeater, потому что у меня была веб-страница с элементом управления Repeater на веб-сайте, на котором была включена функция EnableEventValidation. Это было не хорошо Я получаю недопустимые исключения, связанные с обратной передачей.

Для меня сработало установить EnableViewState = "false" для повторителя. Преимущества заключаются в том, что его проще использовать, просто отключив проверку событий для веб-сайта или веб-страницы, но область действия намного меньше, чем отключение проверки событий для любого из них.

16 голосов
/ 19 апреля 2016

Ничто из вышеперечисленного не сработало для меня. После дальнейших раскопок я понял, что пропустил 2 формы, примененные на странице, которая вызывала проблему.

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

Имейте в виду, что недавно ASP.NET начал рассматривать iframes внутри тега формы, который содержит тег формы в самом документе iframe как вложенный фрейм. Мне пришлось убрать iframe из тега формы, чтобы избежать этой ошибки.

12 голосов
/ 13 октября 2011

У меня была такая же проблема при изменении ListBox с использованием JavaScript на клиенте. Это происходит, когда вы добавляете новые элементы в ListBox от клиента, которых не было при визуализации страницы.

Исправление, которое я нашел, состоит в том, чтобы информировать систему проверки событий обо всех возможных допустимых элементах, которые можно добавить с клиента. Это делается путем переопределения Page.Render и вызова Page.ClientScript.RegisterForEventValidation для каждого значения, которое ваш JavaScript может добавить в список:

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

Это может быть болезненно, если у вас есть большое количество потенциально допустимых значений для списка. В моем случае я перемещал элементы между двумя списками ListBox - один, который имеет все возможные значения, и другой, который изначально пуст, но заполняется подмножеством значений из первого в JavaScript, когда пользователь нажимает кнопку. В этом случае вам просто нужно перебрать элементы в первом ListBox и зарегистрировать каждый из них во втором списке:

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}
9 голосов
/ 28 февраля 2011

Еще один способ, не упомянутый здесь, это создать подкласс ListBox

Т.е..

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation отключает атрибут System.Web.UI.SupportsEventValidation, если вы создаете его подкласс, если вы не добавите его явно, он никогда не вызовет процедуру проверки. Это работает с любым элементом управления, и я нашел единственный способ «отключить» его для элемента управления на основе элемента управления (т. Е. Не на уровне страницы).

7 голосов
/ 19 февраля 2009

3: я изменил свой тип кнопки в сетке столбец от "PushButton" до "LinkButton". Это сработало! ("ButtonType =" LinkButton ") Я думаю, что если Вы можете изменить свою кнопку на другой контролирует как "LinkButton" в других случаях, это будет работать правильно.

Хотел бы я проголосовать за тебя, Амир (увы, мой представитель слишком низок.) У меня просто была эта проблема, и изменение ее работало как чемпион в моем сетке. Чуть в стороне, я думаю, правильный код: ButtonType = "Link"

Я подозреваю, что это потому, что когда вы нажимаете «изменить», ваши изменения изменяются на «обновить» и «отменить», которые затем возвращаются к «редактировать» при отправке. И эти переключатели делают .net непростым.

7 голосов
/ 18 августа 2015

вы пытаетесь сделать что-то подобное на своей странице .aspx

добавить

EnableEventValidation = "ложь"

Вы можете задать любой вопрос!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...