Неверный аргумент обратной передачи или обратного вызова. Проверка события включена с помощью '<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
39 ответов
Проблема в том, что ASP.NET не узнает об этом дополнительном или удаленном элементе списка. У вас есть несколько вариантов (перечислены ниже):
- Отключить проверку событий (плохая идея, потому что вы теряете немного безопасности, которая приходит с очень небольшими затратами).
- Используйте ASP.NET Ajax UpdatePanel. (Поместите список в панель обновлений и запустите обновление, если вы добавите или удалите список. Таким образом, viewstate и связанные с ним поля будут получать обновления, и проверка событий будет проходить.)
- Забудьте на стороне клиента и используйте классическую обратную передачу, а также добавьте или удалите серверную часть списка.
Надеюсь, это поможет.
У вас есть коды в ваших событиях Page_Load? если да, то, возможно, добавление следующего поможет.
if (!Page.IsPostBack)
{ //do something }
Эта ошибка выдается, когда вы нажимаете на команду и снова запускается Page_load, в нормальном жизненном цикле будет Page_Load -> Нажмите Command -> Page_Load (снова) -> Process ItemCommand Event
У меня был опыт работы с DataGrid. Одним из столбцов была кнопка "Выбрать". Когда я нажимал кнопку "Выбрать" в любой строке, я получил это сообщение об ошибке:
"Недопустимый аргумент обратной передачи или обратного вызова. Проверка события включена с использованием в конфигурации или <% @ Page EnableEventValidation =" true "%> на странице. В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова исходят от серверного элемента управления, который первоначально предоставил их. Если данные действительны и ожидаемы, используйте метод ClientScriptManager.RegisterForEventValidation, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки. "
Я изменил несколько кодов, и, наконец, мне это удалось. Мой опыт маршрута:
1) Я изменил атрибут страницы на EnableEventValidation="false"
, Но это не сработало. (не только это опасно по соображениям безопасности, мой обработчик событий не вызывался: void Grid_SelectedIndexChanged(object sender, EventArgs e)
2) я реализовал ClientScript.RegisterForEventValidation
в методе рендеринга. Но это не сработало.
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 на стороне клиента, оно работает. Однако, я бы порекомендовал вам заглянуть в панель обновления, прежде чем идти по этому пути.
Ничто из вышеперечисленного не помогло мне. После дальнейших раскопок я понял, что пропустил 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 из тега формы, чтобы избежать этой ошибки.
У меня была такая же проблема с Repeater, потому что у меня была веб-страница с элементом управления Repeater на веб-сайте, на котором была включена функция EnableEventValidation. Это было не хорошо. Я получаю недопустимые исключения, связанные с обратной передачей.
То, что работало для меня, было установить EnableViewState="false" для повторителя. Преимущества заключаются в том, что его проще использовать, просто отключив проверку событий для веб-сайта или веб-страницы, но область действия намного меньше, чем отключение проверки событий для обоих.
У меня была такая же проблема при изменении 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);
}
Вы пытаетесь что-то подобное, на своей странице.aspx
добавлять
EnableEventValidation="ложь"
Вы можете задать любой вопрос!
Еще один способ, не упомянутый здесь, это создать подкласс ListBox
То есть.
public class ListBoxNoEventValidation : ListBox
{
}
ClientEventValidation отключает атрибут System.Web.UI.SupportsEventValidation, если вы создаете его подкласс, если вы не добавите его явно, он никогда не вызовет процедуру проверки. Это работает с любым элементом управления, и я нашел единственный способ "отключить" его для элемента управления на основе элемента управления (т. Е. Не на уровне страницы).
Если вы заполняете DropdownList через скрипт на стороне клиента, то очистите список, прежде чем отправить форму обратно на сервер; тогда ASP.NET не будет жаловаться, и безопасность будет все еще включена.
И чтобы получить данные, выбранные из DDL, вы можете прикрепить событие "OnChange" к DDL, чтобы собрать значение в скрытом вводе или в текстовом поле со стилем ="display: none;"
3: я изменил свой тип кнопки в столбце сетки с "PushButton" на "LinkButton". Это сработало! ("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();
}
}
Оригинальная статья:
Я реализовал вложенный вид сетки и столкнулся с той же проблемой. Я использовал 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);
В моем "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);
Надеюсь, это поможет кому-то.
Если вы измените UseSubmitBehavior="True"
в UseSubmitBehavior="False"
ваша проблема будет решена
<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />
Эта ошибка будет отображаться без обратной передачи
Добавить код:
If(!IsPostBack){
//do something
}
У меня была та же проблема, что и я:
Только что добавил условие if(!IsPostBack)
и работает нормально:)
Простым решением этой проблемы является использование проверки IsPostBack при загрузке вашей страницы. Это решит эту проблему.
Я знаю, что это супер-старый пост. Предполагая, что вы звоните в свое приложение, вот идея, которая работает для меня:
- Реализуйте ICallbackEventHandler на своей странице
- Вызовите ClientScriptManager.GetCallbackEventReference для вызова кода на стороне сервера
- Как говорится в сообщении об ошибке, вы можете вызвать ClientScriptManager.RegisterForEventValidation
Если вам не нужен полный контроль, вы можете использовать панель обновления, которая сделает это за вас.
Если вы используете gridview и не привязываете gridview при загрузке страницы внутри! Ispostback, то эта ошибка возникает, когда вы нажимаете на edit и удаляете строку в gridview .
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
bindGridview();
}
Мы столкнулись с этой же проблемой, когда преобразовывали наши обычные страницы ASPX в страницы контента.
Страница с этим вопросом имела </form>
тег в одном из разделов контента, таким образом, два конечных тега формы были отображены во время выполнения, что вызвало эту проблему. Удаление дополнительного тега конца формы со страницы решило эту проблему.
Ajax UpdatePanel делает это, и я думаю, что это самый простой способ, игнорируя издержки обратной передачи Ajax.
В этом случае добавьте идентификатор к кнопке в RowDataBound сетки. Это решит вашу проблему.
Как сказал Ник Б., и это сработало для меня, в некоторых случаях вы должны удалять разрывы строк. Посмотрите на код:
-Неправильный способ:
<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+
Лучший вариант - использовать скрытое поле и не отключать проверку события, а также изменить каждый список, выпадающий список для выбора с атрибутом сервера runat.
Для меня сработало перемещение следующего кода из 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>");
}
Это было причиной, почему я получил это:
У меня был ASP:ListBox. Изначально это было скрыто. На стороне клиента я бы заполнил его через AJAX с опциями. Пользователь выбрал один вариант. Затем, при нажатии кнопки "Отправить", сервер рассмеялся над ListBox, так как не помнил, чтобы у него были какие-либо параметры.
Так что я сделал, чтобы убедиться, что я очистил все параметры списка перед отправкой формы на сервер. Таким образом, сервер не жаловался, так как список ушел к клиенту пустым и вернулся пустым.
Сортировка!!!
После возникновения этой проблемы на удаленных серверах (производственный, тестовый, qa, промежуточный и т. Д.), Но не на локальных рабочих станциях разработки, я обнаружил, что пул приложений был настроен с RequestLimit, отличным от 0.
Это заставило пул приложений сдаться и ответить с исключением, отмеченным в вопросе.
Для нас проблема возникала случайно только в производственной среде. RegisterForEventValidation ничего для нас не сделал.
Наконец, мы выяснили, что на веб-ферме, в которой работало приложение asp.net, на двух серверах IIS были установлены разные версии.net. Похоже, что у них были разные правила для шифрования хэша проверки asp.net. Их обновление решило большую часть проблемы.
Кроме того, мы настроили machineKey(compatibilityMode) (одинаково на обоих серверах), httpRuntime(targetFramework), ValidationSettings:UnobtrusiveValidationMode, страницы (renderAllHiddenFieldsAtTopOfForm) в web.config обоих серверов.
Мы использовали этот сайт для генерации ключа https://www.allkeysgenerator.com/Random/ASP-Net-MachineKey-Generator.aspx
Мы потратили много времени на решение этого вопроса, надеюсь, это кому-то поможет.
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
...
</appSettings>
<system.web>
<machineKey compatibilityMode="Framework45" decryptionKey="somekey" validationKey="otherkey" validation="SHA1" decryption="AES />
<pages [...] controlRenderingCompatibilityVersion="4.0" enableEventValidation="true" renderAllHiddenFieldsAtTopOfForm="true" />
<httpRuntime [...] requestValidationMode="2.0" targetFramework="4.5" />
...
</system.web>
Четыре минуты назад я получил ту же ошибку. Тогда я исследовал в течение получаса, как ты. На всех форумах они обычно говорят "добавить страницу enableEvent..=false или true". Любое предложенное решение не решило мои проблемы, пока я не нашел его. Проблема, к сожалению, в кнопке ASP.NET. Я удалил это две секунды назад. Я попытался заменить на кнопку "imagebutton", но это также было неприемлемо (потому что оно выдало ту же ошибку).
Наконец я заменил на LinkButton
, Кажется, это работает!