Поврежденных обратной передачи или аргумент callback. Проверка событий включена с помощью ' '

Я получаю следующую ошибку, когда я отправляю обратно на стороне клиента. У меня есть код 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

30 ответов


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

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

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


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

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

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


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

"поврежденных обратной передачи или аргумент callback. Проверка событий включена с помощью in configuration или на странице. В целях безопасности эта функция проверяет, что аргументы для передачи или события обратного вызова исходят из серверного элемента управления, который первоначально оказывать им. Если данные действительны и ожидаемы, используйте 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" в других случаях, она будет работать правильно.


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

есть две основные проблемы с добавлением элементов в asp: клиентская сторона listbox.

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

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

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

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

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


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

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


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


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

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

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

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

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}

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

Ie.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation ключи от системы атрибутов.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.SupportsEventValidation если вы не разделяете его, если вы явно добавить его обратно, он никогда не назовет рутинную проверку. Это работает с любым элементом управления и является единственным способом, который я нашел, чтобы "отключить" его на элементе управления по элементу управления (т. е. не на уровне страницы).


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

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

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


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

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

Решение 1:

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

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

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

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

решение 2:

в OnInit () введите код примерно так, чтобы установить уникальный идентификатор для кнопки/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/


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

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


вы попробуйте что-то подобное, в вашем.aspx-страницы

добавить

EnableEventValidation= "false"

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


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

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

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

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

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


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

я добавил параметры в раскрывающийся список на событие 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 "(hiddenfield) были варианты, разделенные новой строкой, например:

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

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

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

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);

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


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


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


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


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

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

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


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

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


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

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

If(!IsPostBack){

 //do something

}

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

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


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


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

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


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


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

вот пример кода для переопределения метода рендеринга (в VB и C#) и объявления потенциального значения для ddCar dropdownlist.

в 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

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

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

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


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

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

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

отсортированный!!!


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

-неправильно:

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

-правильно:

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

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