如何解决此问题?
下面的错误详细信息:
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。您有很多选项(在下面列出):想法,因为您损失了一些安全性,而付出的代价却很小。)
使用ASP.NET Ajax UpdatePanel。 (如果添加或删除列表框,则将列表框放入Updatepanel并触发更新。这样,视图状态和相关字段将获得更新和事件验证。)
忘记客户端,使用经典回发并添加或删除服务器端列表项。
我希望这会有所帮助。
评论
另一种选择:实现IPostBackEventHandler并调用js __doPostBack('<%= UniqueId.ToString()%>',arg)
– gdbdable
2014年5月22日在7:11
根据上述建议,我将下拉列表放到常规的ASP.NET asp:UpdatePanel中,将下拉列表加载到后面的代码中,然后再加载newNewRecord.Update();。
–里卡多·阿普尔顿
16年1月19日在11:24
#2 楼
您的Page_Load事件中是否有代码?如果是,那么添加以下内容可能会有所帮助。生命周期将是Page_Load->单击Command-> Page_Load(再次)->处理ItemCommand事件
评论
非常感谢,这就是我的诀窍!我在页面加载中重新加载了一个下拉列表,因此框架失去了对ddl中各项(新项)的控制,而我单击的项(不再存在)
–米歇尔
2011年1月10日19:32
我有和OP相同的错误...我在表单中使用向导,并在页面加载中调用了0步骤。删除,问题消失了。谢谢...
–tking
2011年1月25日在22:48
非常感谢您提供此答案。...遇到了同样的问题,原来我只是忘记了在将数据加载到网格中时忽略回发...节省了大量时间
– Quagmire
2012年5月14日晚上8:41
h!从MVC返回Web表单是很痛苦的。这是正确的答案
– Vishnoo Rath
2014年8月29日在8:16
我这样做了,但对我来说却行不通,因为当它不是回发时,必须在page_load事件中运行一些代码,因此我仍然遇到相同的错误。禁用中继器的viewstate可以解决此问题。
–布莱恩(Bryan)
15年4月14日在20:34
#3 楼
我有使用DataGrid的经验。其中的一列是“选择”按钮。当我单击任意行的“选择”按钮时,我收到以下错误消息:“无效的回发或回调参数。使用in configuration或
<为了安全起见,此功能验证页面回发或
回调事件的参数源自最初呈现它们的服务器控件。如果数据有效且预期,使用
ClientScriptManager.RegisterForEventValidation方法来注册回发或回调数据以进行验证。“
我更改了几个代码,终于成功了。我的经验路线:
1)我将page属性更改为
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)我将网格列中的按钮类型从
PushButton
更改为LinkButton
。有效! (“ ButtonType =” LinkButton“)。我认为,在其他情况下,如果您可以将按钮更改为“ LinkButton”之类的其他控件,它将正常工作。评论
我的解决方案是放弃数据网格内的嵌套按钮。 MS再次使我失望。
–Jacobs数据解决方案
10年6月16日在20:49
您的解决方案也为我工作。谢谢。但是我想知道为什么当linkButton在同一程序上工作时Button不起作用。如果是这样,我们是否总是需要使用linkButton?我们怎样才能变得更加灵活?
–坦率的Myat Thu
2012年10月29日6:42
尝试添加到您的按钮UseSubmitBehavior =“ False”stackoverflow.com/questions/2968525/…
– JJschk
2012年12月6日18:04
Awesomeeeeeee :) ..您只能从经验中学到这一点。.您证明了真实的情景表演经验是最好的老师。
– saun4frsh
2014年7月27日在13:09
在Render的替代中,您必须放置base.Render(writer);最后...否则它将无法正常工作!
– Paul Zahra
16年4月7日在10:29
#4 楼
您真的要做2或3,不要禁用事件验证。向asp中添加项目有两个主要问题:列表框客户端。
第一个是它会干扰事件验证。返回到服务器的不是发送给服务器的。
第二个是,即使禁用事件验证,当页面被发回时,列表框中的项目也会从viewstate重建,因此您所做的任何更改在客户端上作出的丢失。原因是asp.net不希望在客户端上修改列表框的内容,它只希望进行选择,因此它会丢弃您可能进行的任何更改。
最好的选择是按照建议使用更新面板。如果您确实需要此客户端,另一种选择是使用普通的旧版
<select>
而不是<asp:ListBox>
,并将项目列表保留在隐藏字段中。当页面在客户端上呈现时,您可以从文本字段内容的拆分中填充页面。 然后,当您准备好发布它时,您可以从修改后的
<select>
中重新填充隐藏字段的内容。然后,当然,您必须再次在服务器上拆分它并对您的项进行处理,因为您的选择现在已返回服务器,因此您的选择为空。我不会真的建议您这样做,但是如果您确实必须对listBox进行客户端修改,那么它确实可以工作。但是,我真的建议您在走这条路线之前先检查一下updatePanel。评论
c,您不需要将所选项目保留在隐藏字段中,如果使选择框runat =“ server”,则可以从Request.Form [selectid.UnqiueID]中读取回发的值。如果选择了多个,浏览器会将其值作为csv发布。请注意,由于您已经修改了服务器不知道的客户端上的itrmlist,因此控件的项目和selectedindex属性在服务器上将是错误的。
–迈克尔
2011年6月29日在1:37
迈克尔,行得通。只要您添加“ multiple = true”,否则只会给您1个值。谢谢
– Sameer Alibhai
2011年12月7日在16:57
对于包含换行符的下拉列表也存在相同的问题。更改为选择效果很好。谢谢!
–切肉刀
2014年2月12日在22:05
我使用普通的
#5 楼
我在Repeater上遇到了同样的问题,因为我在启用EnableEventValidation的网站上有一个带有Repeater控件的网页。不好我收到了与回发相关的无效异常。对我有用的是为Repeater设置EnableViewState =“ false”。优点是它易于使用,就像为网站或网页关闭事件验证一样简单,但是范围远比为两者关闭事件验证要小得多。
评论
我在旧版网络控件中遇到了这个确切的问题。我们的网络平台/ CMS(网站核心)进行了重大更新,从而启用了事件验证功能(之前已关闭!糟糕!)。转发器控件正在Web画廊中显示图像(带有重新排列按钮的按钮),并且在这些按钮的回发中会发生异常。我按照您的建议使用EnableViewState =“ false”禁用了转发器上的视图状态,嘿,它起作用了。正如其他人发现的那样,覆盖Render()并使用ClientScriptManager.RegisterForEventValidation()对我不起作用。谢谢!
– xan
10年7月19日在10:34
像@xan一样,我也使用Sitecore,这正是我所需要的。
–wilsjd
2012年11月28日在7:05
这也对我有用。 AJAX Update面板也可以正常工作,但是在这种情况下,它是我不需要的庞大开销,所以谢谢Umar Farooq Khawaja。
–布莱恩(Bryan)
15年4月14日在19:49
#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已开始考虑在表单标签,该表单标签在iframe文档本身中包含一个嵌套框架。我必须将iframe移出form标签,以免发生此错误。
#7 楼
在客户端上使用JavaScript修改ListBox时遇到相同的问题。当您从呈现页面时不存在的客户端新项添加到ListBox时,就会发生这种情况。我发现的解决方法是将可以从客户端添加的所有可能的有效项目通知事件验证系统。为此,您可以重写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);
}
如果列表框中有大量可能有效的值,这可能会很麻烦。在我的情况下,我在两个ListBoxes之间移动项目-一个具有所有可能值的项目,另一个最初是空的,但是当用户单击按钮时,会填充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
{
}
ClientEventValidation将属性System.Web.UI.SupportsEventValidation取消,如果您将其子类化,除非您明确地将其重新添加,否则它将永远不会调用验证例程。这适用于任何控件,并且是我发现以控件为基础“禁用”它(即,不是页面级别)的唯一方法。
评论
这里很好地描述。
– Pavel Hodek
2012年5月3日上午8:24
我认为解决此问题的最佳方法是这样做。我们应该将其固定在控件级别而不是页面级别,并冒所有涉及+1的控件的安全性的风险,并感谢@PavelHodek提供的链接。
–詹姆斯·普洛斯(James Poulose)
13年3月13日在19:29
不幸的是,如果您执行此操作,则在回发页面时,如果选择了这些列表项,则将无法识别客户端上添加的任何列表项。
–乔纳森·伍德
13-10-14在22:21
#9 楼
您可以在.aspx页面中尝试类似的操作添加
EnableEventValidation =“ false”
您可以提任何问题!
评论
我认为如果在这种情况下,为了停止看到错误而禁用框架提供的内置验证是最合适的解决方案。
– Jviaches
18-10-3在19:15
#10 楼
如果您通过客户端脚本填写DropdownList,请先清除列表,然后再将表单提交回服务器。那么ASP.NET将不会抱怨,并且安全性仍将保持不变。隐藏的输入或带有Style =“ display:none;”的文本框中评论
+1易于实现。可能不是最干净的,但是足够简单。
– nutsch
2014年8月27日在20:36
#11 楼
3:我在grid
列中将按钮类型从“ PushButton”更改为“
我希望我能投票赞成你,阿米尔(我的代表太低了。)我只是遇到了这个问题,在我的gridview上更改它就像是一个冠军。撇开一点,我认为有效的代码是:ButtonType =“ Link”
我怀疑这是因为当您单击“编辑”时,您的编辑更改为“更新”和“取消”,然后又更改回在提交时进行“编辑”。这些变化的控件使.net感到不舒服。
评论
这个问题的症结在于asp.net事件验证模型,以及在回发时客户端是否修改了“页面”。您是什么意思'.....而这些转换控件使.net感到不舒服'?
–朱利叶斯A
09年2月19日在14:18
#12 楼
(1)EnableEventValidation =“ false” .....对我不起作用。(2)ClientScript.RegisterForEventValidation .. ..它对我不起作用。
解决方案1:
将GridView中的Button / ImageButton更改为LinkButton。有用。 (但我喜欢ImageButton)
研究:Button / ImageButton和LinkButton使用不同的方法回发
原创文章:
http:// geekswithblogs .net / mahesh / archive / 2006/06/27 / 83264.aspx
解决方案2:
在OnInit()中,输入类似这样的代码来设置唯一ID for 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 /
#13 楼
我实现了一个嵌套的网格视图,并且遇到了相同的问题。在使用类似这样的列之前,我使用LinkButton代替了图像按钮:br />
我已经替换成这样。
<asp:TemplateField ItemStyle-Width="9">
<ItemTemplate>
<asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
runat="server" />
</ItemTemplate>
</asp:TemplateField>
#14 楼
我遇到了类似的问题,但是我没有使用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";
问题在于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);
希望对某人有所帮助。
#15 楼
如果将UseSubmitBehavior="True"
更改为UseSubmitBehavior="False"
,您的问题将得到解决<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />
评论
那对我没用。我虽然使用图像按钮,但在转发器的表中,所以情况并不完全相同。禁用中继器的视图状态对我有用。
–布莱恩(Bryan)
15年4月14日在20:35
#16 楼
我遇到了同样的问题,我做了什么:#17 楼
将显示此错误而无需回发添加代码:
If(!IsPostBack){
//do something
}
#18 楼
在这种情况下,将id添加到网格的RowDataBound中的按钮。它将解决您的问题。#19 楼
解决此问题的简单方法是在页面加载时使用IsPostBack检查。这样可以解决这个问题。#20 楼
Ajax UpdatePanel做到了,而且我认为这是最简单的方法,而忽略了Ajax回发开销。#21 楼
我知道这是一个非常古老的职位。假设您正在调用应用程序,这对我有用:在页面上实现ICallbackEventHandler
调用ClientScriptManager.GetCallbackEventReference来调用服务器端代码
如错误消息所述,然后可以调用ClientScriptManager.RegisterForEventValidation
如果不需要完全控制,则可以使用更新面板来帮您实现。 />
#22 楼
当我们将常规的ASPX页面转换为Content页面时,我们也遇到了同样的问题。带有此问题的页面在“内容”部分之一中具有
</form>
标记,因此在运行时呈现了两个表单结束标记,从而导致了此问题。从页面中删除多余的表单结束标签可解决此问题。评论
谢谢,事实证明我的代码中还有额外的
#23 楼
如果您正在使用gridview而不在!ispostback内的pageload上绑定gridview,则当您单击gridview中的edit and delete row时,会发生此错误。 protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
bindGridview();
}
#24 楼
四分钟前,我收到了同样的错误。然后我像你一样在一个半小时内进行了研究。在所有论坛中,他们通常会说“添加页面enableEvent .. = false或true”。在我找到解决方案之前,提出的任何解决方案都无法解决我的问题。不幸的是,该问题是ASP.NET按钮。我两秒钟前将其删除。我尝试用“ imagebutton”替换,但也是不可接受的(因为它给出了相同的错误)。最后我用
LinkButton
替换了。它似乎正在工作!#25 楼
我正在使用数据列表,但按钮也遇到相同的错误。我只是使用IsPostBack检查并填充我的控件,问题就解决了!太好了!#26 楼
对我有用的是将以下代码从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>");
}
#27 楼
最好的选择是使用隐藏字段并且不禁用事件验证,还更改每个列表框,下拉列表以使用runat服务器属性进行选择评论
从asp控件更改为常规
#28 楼
如果您使用的是Ajax更新面板。添加<Triggers>
标签,并在其中触发使用<asp:PostBackTrigger .../>
的Button或控件导致postBack #29 楼
如果您预先知道可以填充的数据,则可以使用ClientScriptManager来解决此问题。在先前的用户选择中使用javascript动态填充下拉框时,我遇到了这个问题。下拉列表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#的细微变化可能是: br />
对于新手:这应该放在文件(.vb或.cs)后面的代码中,或者如果用于aspx文件中,则可以包装在
<script>
标记中。#30 楼
这就是我得到它的原因:我有一个ASP:ListBox。最初它是隐藏的。在客户端,我将通过带有选项的AJAX填充它。用户选择了一个选项。然后,当单击“提交”按钮时,服务器将使ListBox变得很有趣,因为它不记得它具有任何选项。将表单提交回服务器。这样,服务器就不会抱怨,因为列表转到客户端是空的,然后又回到了空。
排序!!!
评论
不要在page_load事件中执行数据绑定。