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

Я получаю следующую ошибку при отправке страницы с клиентской стороны. У меня есть 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
205
задан Julius A 23 окт. '08 в 11:34
источник поделиться
37 ответов
  • 1
  • 2

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

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

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

156
ответ дан norbertB 23 окт. '08 в 12:03
источник поделиться

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

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

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

156
ответ дан Jeff Pang 21 сент. '10 в 12:30
источник поделиться

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

"Недопустимый аргумент обратной передачи или обратного вызова. Проверка событий активируется с использованием в конфигурации или     <% @Страница 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 ", в других случаях это будет работать правильно.

28
ответ дан Amir Chatrbahr 09 нояб. '08 в 10:57
источник поделиться

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

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

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

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

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

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

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

25
ответ дан Andy C. 29 окт. '08 в 4:35
источник поделиться

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

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

15
ответ дан Umar Farooq Khawaja 19 нояб. '09 в 15:25
источник поделиться

Ничто из этого не помогло мне. После более глубокого рытья я понял, что упустил 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 из тега формы, чтобы избежать этой ошибки.

11
ответ дан biggles 19 апр. '16 в 19:39
источник поделиться

Другим способом, не упомянутым здесь, является подкласс ListBox

Т.е.

public class ListBoxNoEventValidation : ListBox 
{
}

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

9
ответ дан Mike C. 28 февр. '11 в 18:56
источник поделиться

У меня была такая же проблема при изменении 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);
}

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

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}
9
ответ дан Josh 13 окт. '11 в 9:25
источник поделиться

(1) EnableEventValidation = "false"... Это не работает для меня.

(2) ClientScript.RegisterForEventValidation.... Это не работает для меня.

Решение 1:

Сменить кнопку /ImageButton на LinkButton в GridView. Оно работает. (Но мне нравится ImageButton)

Исследование: Button/ImageButton и LinkButton используют разные методы для обратной передачи

Оригинальная статья:

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

Решение 2:

В OnInit() введите код примерно так, чтобы установить уникальный идентификатор для Button/ImageButton:

protected override void OnInit(EventArgs e) {
  foreach (GridViewRow grdRw in gvEvent.Rows) {

  Button deleteButton = (Button)grdRw.Cells[2].Controls[1];

  deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
  }
}

Оригинальная статья:

http://www.c-sharpcorner.com/Forums/Thread/35301/

6
ответ дан yilee 30 марта '13 в 5:58
источник поделиться

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

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

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

5
ответ дан brian welch 19 февр. '09 в 3:39
источник поделиться

Если вы заполните DropdownList на стороне клиента script, затем очистите список перед отправкой формы обратно на сервер; то ASP.NET не будет жаловаться и безопасность будет по-прежнему включена.

И чтобы получить данные, выбранные из DDL, вы можете прикрепить событие "OnChange" к DDL для сбора значения в скрытом вводе или в текстовом поле со Style = "display: none;"

5
ответ дан MyEname 11 дек. '08 в 23:43
источник поделиться

Я реализовал представление вложенной сетки, и я столкнулся с той же проблемой. Я использовал LinkButton вместо кнопки изображения следующим образом:

до того, как я столкнулся с таким столбцом:

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

Я заменил это.

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 
4
ответ дан Swathi 21 апр. '11 в 15:34
источник поделиться

попробуйте что-то подобное на странице .aspx

добавить

EnableEventValidation = "ложь"

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

4
ответ дан user3690871 18 авг. '15 в 8:46
источник поделиться

если вы измените UseSubmitBehavior="True" на UseSubmitBehavior="False", ваша проблема будет решена.

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />
3
ответ дан ali joodie 20 февр. '11 в 10:37
источник поделиться

У меня была аналогичная проблема, но я не использовал ASP.Net 1.1 или не обновлял элемент управления через javascript. Моя проблема произошла только в Firefox, а не в IE (!).

Я добавил опции DropDownList в событие PreRender следующим образом:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

В моем "HF" (скрытом поле) были опции, разделенные символом новой строки, например:

HF.value = "option 1\n\roption 2\n\roption 3";

Проблема заключалась в том, что HTML-страница была сломана (я имею в виду, имела новые строки) в параметрах "select", которые представляли DropDown.

Итак, я решил свою проблему добавить одну строку:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

Надеюсь, что это поможет кому-то.

3
ответ дан pamelo 14 нояб. '10 в 19:05
источник поделиться

У меня была та же проблема, что я и сделал:

Просто добавлено условие if(!IsPostBack), и он отлично работает:)

3
ответ дан Niket 05 авг. '11 в 11:55
источник поделиться

Мы столкнулись с этой проблемой, когда мы конвертировали наши обычные страницы ASPX на страницы контента.

Страница с этой проблемой имела тег </form> в одном из разделов Content, поэтому во время выполнения были отображены два тега конца формы, что вызвало эту проблему. Удаление дополнительной метки конца страницы со страницы разрешило эту проблему.

2
ответ дан Tushar 17 февр. '11 в 21:56
источник поделиться

Я знаю, что это супер-старый пост. Предполагая, что вы звоните в свое приложение, вот идея, которая сработала для меня:

  • Внедрите ICallbackEventHandler на своей странице
  • Вызовите ClientScriptManager.GetCallbackEventReference для вызова кода на стороне сервера.
  • Как указано в сообщении об ошибке, вы можете вызвать ClientScriptManager.RegisterForEventValidation

Если вам не нужен полный контроль, вы можете использовать панель обновления, которая сделает это за вас.

2
ответ дан tmck2 21 окт. '11 в 21:50
источник поделиться

В этом случае добавьте id к кнопке в RowDataBound сетки. Это решит вашу проблему.

2
ответ дан nilesh 05 мая '09 в 15:55
источник поделиться

Четыре минуты назад я получил ту же ошибку. Затем я исследовал полчаса, как вы. На всех форумах они обычно говорят "добавьте страницу enableEvent.. = false или true". Любое предлагаемое решение не разрешило мои проблемы, пока я не нашел его. К сожалению, проблема заключается в кнопке ASP.NET. Я снял его две секунды назад. Я попытался заменить "imagebutton", но он также был неприемлем (потому что он дал ту же ошибку).

Наконец, я заменил на LinkButton. он работает!

1
ответ дан cem 27 июля '10 в 21:59
источник поделиться

Я использовал datalist, и я получал ту же ошибку для моей кнопки. Я просто использую IsPostBack для проверки и заполнения своих элементов управления, и проблема решена! Отлично!!!

1
ответ дан Razia 08 марта '10 в 16:49
источник поделиться

Если вы используете панель обновления Ajax. Добавьте тег <Triggers> и внутри него запускается кнопка или элемент управления, вызывающий postBack с помощью <asp:PostBackTrigger .../>

1
ответ дан devo882 04 мая '11 в 15:50
источник поделиться

Лучше всего использовать скрытое поле и не отключать проверку событий, а также изменять каждый список, выпадающий список для выбора с атрибутом сервера runat

1
ответ дан Programista 14 июня '11 в 16:12
источник поделиться

Если вы знаете данные, которые могут быть заполнены, вы можете использовать ClientScriptManager для решения этой проблемы. У меня была эта проблема при динамическом заполнении раскрывающегося списка с использованием javascript при предыдущем выборе пользователя.

Вот пример кода для переопределения метода рендеринга (в VB и С#) и объявления потенциального значения для выпадающего списка ddCar.

В VB:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Dim ClientScript As ClientScriptManager = Page.ClientScript

    ClientScript.RegisterForEventValidation("ddCar", "Mercedes")

    MyBase.Render(writer)
End Sub

или небольшое изменение в С# может быть:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

Для новичков: это должно идти в коде за файлом (.vb или .cs) или если используется в aspx файле, вы можете обернуть теги <script>.

1
ответ дан CraigS 19 дек. '12 в 12:50
источник поделиться

Вот почему я его получал:

У меня был ASP: ListBox. Первоначально он был скрыт. На стороне клиента я мог бы заполнить его через AJAX с помощью опций. Пользователь выбрал один из вариантов. Затем, нажав кнопку "Отправить", сервер получит все смешные сведения о ListBox, поскольку он не помнил, что у него есть какие-либо опции.

Итак, я сделал, чтобы я очистил все параметры списка перед отправкой формы обратно на сервер. Таким образом, сервер не жаловался, поскольку список отправился на клиент пустой и он вернулся пустым.

Сортировано!!!

1
ответ дан user2520440 11 окт. '13 в 16:56
источник поделиться

Эта ошибка будет отображаться без обратной передачи

Добавить код:

If(!IsPostBack){

 //do something

}
1
ответ дан Balaji Selvarajan 26 дек. '13 в 18:03
источник поделиться

Как сказал Nick B, и это сработало для меня, в некоторых случаях вам нужно удалить разрывы строк. Взгляните на код:

-Продолжительный путь:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">
            Item 1</asp:ListItem>
    <asp:ListItem>
            Item 2</asp:ListItem>
    <asp:ListItem>
            Item 3</asp:ListItem>
</asp:DropDownList>

-Right way:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>

Это только для меня в IE10 +

1
ответ дан Andre RB 02 июля '15 в 17:48
источник поделиться

Ajax UpdatePanel делает это, и я думаю, что это самый простой способ, игнорируя служебные данные Ajax postback.

1
ответ дан netseng 21 дек. '08 в 17:16
источник поделиться

Что сработало для меня, переместите следующий код с page_load на page_prerender:

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}
1
ответ дан Murad Dodhiya 15 окт. '10 в 0:35
источник поделиться

FYI У меня была такая же проблема с этим сообщением об ошибке, и было то, что у меня было 2 тега формы на одной странице. Был один на главной странице и один на самой странице. Вскоре, когда я удалил пару тегов второй формы, проблема исчезла.

0
ответ дан markiyanm 11 марта '15 в 20:12
источник поделиться
  • 1
  • 2

Другие вопросы по меткам