Недопустимый аргумент обратной передачи или обратного вызова. Проверка событий активируется с помощью "<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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

У меня был опыт работы с 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 ", в других случаях это будет работать правильно.

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Т.е.

public class ListBoxNoEventValidation : ListBox 
{
}

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

Ответ 9

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

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

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

Ответ 10

(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/

Ответ 11

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

добавить

EnableEventValidation = "ложь"

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

Ответ 12

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

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

Ответ 13

Я реализовал представление вложенной сетки, и я столкнулся с той же проблемой. Я использовал 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> 

Ответ 14

У меня была аналогичная проблема, но я не использовал 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);

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

Ответ 15

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

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

Ответ 16

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

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

Ответ 17

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

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

If(!IsPostBack){

 //do something

}

Ответ 18

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

Ответ 19

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

Ответ 20

Простым решением этой проблемы является использование проверки IsPostBack на загрузке вашей страницы. Это решит эту проблему.

Ответ 21

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

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

Ответ 22

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

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

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

Ответ 23

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

Ответ 24

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

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

Ответ 25

Что сработало для меня, переместите следующий код с 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>");
}

Ответ 26

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

Ответ 27

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

Ответ 28

Если вы знаете данные, которые могут быть заполнены, вы можете использовать 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>.

Ответ 29

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

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

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

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

Ответ 30

Как сказал 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 +