无效的回传或回调参数。为什么?

8

因此,我得到了异常

无效的回发或回调参数。事件验证是使用配置文件中的<pages enableEventValidation="true">或页面中的<%@ Page EnableEventValidation="true" %>启用的功能。出于安全目的,此功能验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

以下是堆栈跟踪信息

[System.ArgumentException: 未捕获的异常: 无效的回发或回调参数。事件验证是使用配置文件中的<pages enableEventValidation="true">或页面中的<%@ Page EnableEventValidation="true" %>启用的功能。出于安全目的,此功能验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。] at System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) at System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) at System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

在提交表单后,快速点击同一页上的LinkButton以下载文件,然后页面再次重新加载时会发生异常。

有人可以解释一下为什么执行上述操作会导致此异常吗?

提前感谢!


当我安装.NET Framework 4.5时,我在生产服务器上遇到了相同的异常。因此,我不得不恢复回.NET 4.0。顺便说一句,.NET 4.5只是.NET 4.0的更新(或服务包),它们不能并存。真是个愚蠢的问题... - Evgeni Nabokov
5个回答

17
这可能是.NET中最令人沮丧的错误之一,但是一旦你对发生的情况有所了解,它就变得有意义了。.NET喜欢知道页面上发生的所有事情,并跟踪其放置在页面上的所有元素。同样,在这些线路上,当.NET接收来自未知来源的输入时,它会感到被冒犯。在您的情况下,似乎在单击LinkButton时,.NET认为它不应该存在。根据我的经验,这可能有两个原因:
  1. 您正在进行客户端操作以创建新输入或克隆现有输入。
  2. 在处理表单提交时,.NET对LinkButton进行了某些操作,导致它不再可用。我遇到这种情况的一些例子是当您的LinkButton在后端动态创建时,或者您正在使用UpdatePanels并且它们的内容在表单提交期间发生了更改时。
基本上,我认为如果您逐步执行表单提交代码并观察LinkButton,您会看到.NET忘记它,这可以理解为单击LinkButton时触发此“安全异常”。

我同意你的建议。我的情况与第二点有关。然而,我无法确定它是如何失败的。控件应该以与原始页面加载(预后台)相同的方式呈现。我的链接按钮在数据列表中。我尝试在绑定数据列表之前使用!IsPostback子句,但仍然失败了。 - Guillermo Gomez
4
"我的 LinkButton 在一个数据列表里" 是关键语句。数据列表在回传时是否被重新绑定了?如果是的话,原始的 LinkButton 就会被清除,新的 LinkButton 会被创建。它们在功能和美学上都是相同的,但是 .NET 知道它们的区别并引发了这个错误。 - chprpipr

3
如果在页面完全渲染之前点击,那么__EVENTVALIDATION字段可能尚未被完全编写,因此会出现错误。
现在这个问题已经在3.5 SP1/3.0 SP2中得到修复,并且可以在web.config文件中进行配置
<configuration>
    <system.web>
        <pages renderAllHiddenFieldsAtTopOfForm="true"></pages>
    </system.web>
</configuration>

默认值为true-那么您正在运行哪个版本的.NET?您可以在页面加载完成之前在客户端禁用按钮。

1
这个错误在一个非常大的页面上对我出现了间歇性的情况。
我发现,如果在页面加载完成之前点击按钮,就会出现这个错误。
在点击按钮之前等待页面完全加载,我就不会遇到这个错误。

0

在页面标记中使用EnableEventValidation="false",将其添加到page.asx中。


3
使用EnableEventValidation="false"是不好的,因为它会降低安全性。 - Dirk Strauss
我同意这会降低安全性,但我找到了解决方案。有什么建议可以解决这个问题吗?@Dirk Strauss - Muhammad Essa
最近这个问题/修复有没有改变?我的页面多年来一直运行正常,但现在出现了这个错误。完整的错误信息:https://gist.github.com/cemerson/12b4b44acd5f58fc6574a4efaf9c46ba - Christopher
这个问题/修复最近有变化吗?我的页面多年来一直正常工作,但现在出现了这个错误。完整错误信息:https://gist.github.com/cemerson/12b4b44acd5f58fc6574a4efaf9c46ba - Christopher

0
我发现如果您不从模板中全部删除HTML表单,它们可能会在WebForms中引起此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接