回发或callback参数无效。 事件validation使用'<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 

问题是,ASP.NET不知道这个额外或删除listitem。 你有一些选项(列在下面):

  • 禁用事件validation(坏主意,因为你失去了一点点的安全性,成本很低)。
  • 使用ASP.NET Ajax UpdatePanel。 (把列表框放在UpdatePanel中,如果你添加或者删除列表框,触发一个更新,这样viewstate和相关的字段会得到更新,事件validation将会通过。)
  • 忘记客户端,并使用经典的回发和添加或删除listitems服务器端。

我希望这有帮助。

你有代码在你的Page_Load事件吗? 如果是的话,那么也许join下面会有所帮助。

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

当你点击你的命令并且Page_load被再次运行时,这个错误就会被抛出,在正常的生命周期中将会是Page_Load – >点击Command – > Page_Load(再次) – > Process ItemCommand事件

我有一个DataGrid的经验。 其中一列是“select”button。 当我点击任何一行的“select”button时,我收到了这个错误信息:

“回发或callback参数无效,事件validation是在configuration页面或<%@ Page EnableEventValidation =”true“%>中启用的,为了安全起见,这个特性validation回传事件或callback事件的参数来源于服务器控件如果数据是有效的和预期的,使用ClientScriptManager.RegisterForEventValidation方法来注册回发或callback数据进行validation。

我改了几个代码,最后我成功了。 我的经验路线:

1)我将页面属性更改为EnableEventValidation="false"但它没有工作。 (不仅因为安全原因这是危险的,我的事件处理程序没有被调用: void Grid_SelectedIndexChanged(object sender, EventArgs e)

2)我在Render方法中实现了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)我将网格列中的buttontypes从PushButton更改为LinkButton有效! (“ButtonType =”LinkBut​​ton“)。我想如果你可以改变你的button,像其他情况下的”LinkBut​​ton“其他控件,它会正常工作。

你真的要做2或3,不要禁用事件validation。

将项目添加到asp:listbox客户端有两个主要问题。

  • 首先是干扰事件validation。 什么回到服务器不是它发送。

  • 第二个是,即使你禁用了事件validation,当你的页面被回发,列表框中的项目将从视图状态重build,所以你在客户端上做的任何改变都会丢失。 这样做的原因是asp.net不希望在客户端上修改列表框的内容,只希望做一个select,所以它会放弃你所做的任何更改。

最好的select是最有可能使用推荐的更新面板。 另一个select,如果你真的需要做这个客户端,是使用一个普通的旧的<select>而不是一个<asp:ListBox> ,并保持你的项目列表在一个隐藏的领域。 当页面在客户端上呈现时,您可以从文本字段内容中分割出来。

然后,当您准备发布它时,您可以从修改过的<select>重新填充隐藏字段的内容。 那么,当然,你必须在服务器上再次拆分它,并且对你的项目做些什么,因为你的select是空的,因为它已经回到了服务器上。

总而言之,这是一个非常麻烦的解决scheme,我不会真的推荐,但是如果你真的必须做一个listBox的客户端修改,它确实有效。 但是,我真的build议你在走这条路线之前先看看updatePanel。

我有一个Repeater相同的问题,因为我有一个Web站点的EnableEventValidation打开一个网站的Repeater控制。 这不好。 我得到无效的回发相关的例外。

我的工作是为Repeater设置EnableViewState =“false”。 其优点是使用起来更简单,就像为网站或网页切换事件validation一样简单,但是范围比closures事件validation要less得多。

以上都没有为我工作。 经过更多的挖掘,我意识到我忽略了在页面上应用的两个表单,导致了这个问题。

 <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已经开始考虑在iframe文档中包含表单标签的表单标签中的iframe,它本身就是一个嵌套的框架。 我必须将iframe从表单标记中移出以避免出现此错误。

另一种不在这里提到的方法是子类ListBox

IE浏览器。

 public class ListBoxNoEventValidation : ListBox { } 

ClientEventValidation在属性System.Web.UI.SupportsEventValidation之外,如果你inheritance它,除非你明确地添加它,它将永远不会调用validation例程。 这适用于任何控件,并且是我发现通过控件(即,而不是页面级别)在控件上“禁用”它的唯一方法。

在客户端上使用JavaScript修改ListBox时,我遇到了同样的问题。 当您将新项目从客户端添加到列表框时,会发生在页面呈现时不在其中的情况。

我发现的修复方法是通知事件validation系统可以从客户端添加的所有可能的有效项目。 您可以通过覆盖Page.Render并为您的JavaScript添加到列表框中的每个值调用Page.ClientScript.RegisterForEventValidation来做到这一点:

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

如果列表框中有大量可能有效的值,这可能会很痛苦。 在我的情况下,我正在两个ListBox之间移动项目 – 其中一个具有所有可能的值,另一个最初是空的,但是当用户单击一个button时,用JavaScript中第一个值的子集填充。 在这种情况下,您只需遍历第一个ListBox中的项目,并在第二个列表框中注册每个项目:

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

如果通过客户端脚本填充DropdownList,则在将表单提交回服务器之前清除该列表; 那么ASP.NET不会抱怨,安全性仍然会继续。

要获取从DDL中select的数据,可以将一个“OnChange”事件附加到DDL,以便在隐藏的input或文本框中使用Style =“display:none;”来收集值

3:我将网格列中的buttontypes从“PushButton”更改为“LinkBut​​ton”。 有效! (“ButtonType =”LinkBut​​ton“)我想如果你可以改变你的button,像其他情况下的”LinkBut​​ton“其他控件,它会正常工作。

我希望我能投票给你,埃米尔(唉,我的代表太低了。)我只是有这个问题,改变这个工作就像我的GridView的冠军。 稍微放一边,我认为有效的代码是:ButtonType =“Link”

我怀疑这是因为当你点击“编辑”时,你的编辑改变为“更新”和“取消”,然后在提交时改回“编辑”。 而这些转移控制使得.net感到不安。

(1)EnableEventValidation =“false”……………….这对我不起作用。

(2)ClientScript.RegisterForEventValidation ….它不适合我。

解决scheme1:

在GridView中将Button / ImageButton更改为LinkBut​​ton。 有用。 (但我喜欢ImageButton)

研究:Button / ImageButton和LinkBut​​ton使用不同的方法来回发

来源文章:

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

解决scheme2:

在OnInit()中,input如下代码来设置Button / ImageButton的唯一ID:

 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/

我实现了一个嵌套的网格视图,我面临同样的问题。我已经使用LinkBut​​ton而不是像这样的button:

之前我有一个这样的专栏:

 <asp:TemplateField ItemStyle-Width="9"> <ItemTemplate> <asp:ImageButton ID="ImgBtn" ImageUrl="Includehttp://img.dovov.comgridplus.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> 

你可以在你的.aspx页面中尝试类似的东西

EnableEventValidation = “假”

你可以随时问任何问题!

如果您将UseSubmitBehavior="True"更改为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选项,如下所示:

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

问题是,代表DropDown的“select”选项中的HTML页面被破坏(我的意思是换行符)。

所以我解决了我的问题添加一行:

 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中的button。 它会解决你的问题。

我知道这是一个超级老post。 假设你正在调用你的应用程序,这是一个适合我的想法:

  1. 在你的页面上实现ICallbackEventHandler
  2. 调用ClientScriptManager.GetCallbackEventReference来调用你的服务器端代码
  3. 如错误消息所示,您可以调用ClientScriptManager.RegisterForEventValidation

如果你不需要完全控制,你可以使用更新面板,这将为你做这个。

当我们将普通的ASPX页面转换为内容页面时,我们遇到了同样的问题。

包含此问题的页面在其中一个内容部分中有一个</form>标记,因此在运行时渲染了两个表单结束标记,这导致了此问题。 从页面中删除额外的表格结束标签解决了这个问题。

四分钟前,我收到了同样的错误。 然后我在半小时内就跟你一样研究。 在所有论坛中,他们通常都会说“add page enableEvent .. = false or true”。 提出的任何解决scheme都没有解决我的问题,直到我find它。 这个问题不幸是一个ASP.NETbutton。 我两秒钟之前就把它删除了 我试图用“imagebutton”replace,但它也是不可接受的(因为它给出了相同的错误)。

最后我用LinkButton取代了。 它似乎在工作!

我正在使用datalist,并得到我的button相同的错误。 我只是使用IsPostBack检查并填写我的控制,并解决问题! 大!!!

Ajax UpdatePanel使它,我认为这是最简单的方法,忽略Ajax回发开销。

什么对我来说是把下面的代码从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>"); } 

最好的select是使用隐藏字段,不要禁用事件validation,还要更改每个列表框,使用runat服务器属性来selectdropdownlist

如果您正在使用Ajax更新面板。 添加<Triggers>标签,并在其内部触发button或控件导致使用<asp:PostBackTrigger .../> postBack

如果您知道可以填充的数据,则可以使用ClientScriptManager来解决此问题。 在以前的用户select中使用javascriptdynamic填充下拉框时,我遇到了这个问题。

这里是一些用于覆盖渲染方法的示例代码(在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填充选项。 用户select了一个选项。 然后当点击提交button时,服务器会对列表框感到有趣,因为它不记得它有任何选项。

所以我所做的是确保在将表单提交回服务器之前清除所有列表选项。 这样的服务器没有抱怨,因为列表到客户端为空,它回来了空。

sorting!

正如尼克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> 

-正确的方法:

 <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 +中发生

此错误将显示无回传

添加代码:

 If(!IsPostBack){ //do something } 

我通过不将ListBox添加到父页面/控件控件集合来解决这个确切的错误。 因为我真的不需要任何服务器端function。 我只是想用它来输出一个自定义的服务器控件的HTML,我自己在OnRender事件处理程序中。 我希望使用该控件可以节省我写回应我自己的HTML。

这个解决scheme对大多数人来说可能不起作用,但是它保持ASP.NET不能对控件执行ValidateEvent,因为控件在回发之间并不保留在内存中。

此外,我的错误是由选定的列表项目是不是在上一个回发列表框中的项目。 Incase帮助任何人。