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

StackOverflow https://stackoverflow.com/questions/228969

Вопрос

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

Решение

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

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

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

Другие советы

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

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

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

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

  

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

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

1) Я изменил атрибут страницы на EnableEventValidation = " false " . Но это не сработало. (это не только опасно)    по соображениям безопасности мой обработчик событий не был вызван: void Grid_SelectedIndexChanged (отправитель объекта, 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.

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

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

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

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

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

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

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

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

Т.е.

public class ListBoxNoEventValidation : ListBox 
{
}

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

  

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

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

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

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

(2) ClientScript.RegisterForEventValidation .... У меня это не работает.

Решение 1:

Измените Button / 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/

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

добавлять

EnableEventValidation="ложь"

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

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

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

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

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

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

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

Проблема заключалась в том, что HTML-страница была повреждена (я имею в виду новые строки) в параметрах " выберите " это представляло 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);

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

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

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

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

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

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

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

If(!IsPostBack){

 //do something

}

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

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

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

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

<Ол>
  • Реализуйте ICallbackEventHandler на своей странице
  • Вызовите ClientScriptManager.GetCallbackEventReference, чтобы вызвать код на стороне сервера
  • Как говорится в сообщении об ошибке, вы можете вызвать ClientScriptManager.RegisterForEventValidation
  • Если вам не нужен полный контроль, вы можете использовать панель обновлений, которая сделает это за вас.

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

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

    Четыре минуты назад я получил ту же ошибку. Тогда я исследовал в течение получаса, как ты. На всех форумах они обычно говорят "добавить страницу 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

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

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

    Вот пример кода для переопределения метода рендеринга (в VB и C #) и объявления потенциального значения для раскрывающегося списка 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
    

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

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

    Для новичков: это должно идти в коде файла (.vb или .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>
    

    Это произошло только для меня в IE10 +

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top