Недопустимый аргумент обратной передачи или обратного вызова. Проверка событий активируется с помощью "<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
задан 23 окт. '08 в 11:34
источник поделиться
37 ответов
  • 1
  • 2

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

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

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

156
ответ дан 23 окт. '08 в 12:03
источник

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

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

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

156
ответ дан 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
ответ дан 09 нояб. '08 в 10:57
источник

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

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

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

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

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

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

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

25
ответ дан 29 окт. '08 в 4:35
источник

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

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

15
ответ дан 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
ответ дан 19 апр. '16 в 19:39
источник

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

Т.е.

public class ListBoxNoEventValidation : ListBox 
{
}

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

9
ответ дан 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
ответ дан 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
ответ дан 30 марта '13 в 5:58
источник

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

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

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

5
ответ дан 19 февр. '09 в 3:39
источник

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

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

5
ответ дан 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
ответ дан 21 апр. '11 в 15:34
источник

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

добавить

EnableEventValidation = "ложь"

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

4
ответ дан 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
ответ дан 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
ответ дан 14 нояб. '10 в 19:05
источник

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

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

3
ответ дан 05 авг. '11 в 11:55
источник

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

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

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

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

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

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

2
ответ дан 21 окт. '11 в 21:50
источник

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

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

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

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

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

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

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

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

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

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

1
ответ дан 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
ответ дан 19 дек. '12 в 12:50
источник

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

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

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

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

1
ответ дан 11 окт. '13 в 16:56
источник

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

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

If(!IsPostBack){

 //do something

}
1
ответ дан 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
ответ дан 02 июля '15 в 17:48
источник

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

1
ответ дан 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
ответ дан 15 окт. '10 в 0:35
источник

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

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

Другие вопросы по меткам или Задайте вопрос