0

这个问题好像以前也有人问过,但我感觉我的情况略有不同。

我有一个包含gridview 的页面。当按下按钮编辑gridview 中的一条记录时,该按钮首先执行一些客户端脚本,该脚本会弹出一个模式窗口以进行编辑(使用.onClientClick 设置)。从这个弹出窗口中,用户点击更新数据库并关闭窗口。一旦窗口关闭,按钮的服务器端代码应该会触发,这将调用函数来刷新gridview。相反,我收到错误消息:

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

真正让我恼火的是,我在不同的页面上使用了完全相同的逻辑,而且效果很好。

关于如何避免这种情况的任何建议?

更新:我已经删除了添加客户端脚本的代码行,但仍然出现错误。所以我相当肯定它只是由回发引起的。经过仔细检查,我意识到实际上有一些 ListItems 以编程方式绑定到 DropDownLists。所以......我可能需要做 ClientScriptManager.RegisterForEventValidation 的事情......有人可以给我一个例子来说明这样做的语法是什么样的吗?似乎与 ScriptManager 对象的设置不同......

4

6 回答 6

1

如果您的按钮是在代码隐藏中创建的(例如,您的RowDataBound事件创建了一个新实例Button并将其添加到单元格),那么您将需要ID在页面的 Control Events 阶段之前重新创建这些控件(具有相同的 s)生命周期。在事件中重新创建按钮Load应该可以正常工作。

如果您的控件已创建并且您已将处理程序附加到它们的事件,则此错误的最可能原因是 javascript 修改了您的 DOM/表单。

于 2009-03-30T20:58:23.367 回答
0

这可能是一个棘手的调试。如果您不使用动态生成的控件,那么最大的罪魁祸首通常是客户端脚本修改了控件绑定到的数据。例如,使用 javascript 将另一个列表项添加到下拉列表将触发此错误,因为服务器会注意到添加的项不是原始数据的一部分。

如果您使用动态控件,则必须确保在每次回发时都以相同的方式创建控件及其数据。

每当我遇到不可调和的事件验证问题时,我通常会在页面上禁用它。这应该是一个安全问题,但我还没有看到依赖于事件验证的漏洞被关闭。实际上,也许我会在 SO 上问这个,看看是否有人知道。清理您的页面输入很容易,并且应该在不考虑事件验证是否会保护您的情况下完成。

于 2009-03-30T21:08:22.267 回答
0

在页面指令中尝试这一行,一旦我遇到类似的错误,错误就解决了

EnableEventValidation="false"

问候!!!

于 2009-03-30T21:51:33.440 回答
0

事件验证将尝试确保有人不会向页面添加与您第一次处理/呈现时允许的值不对应的值。根据您拥有的控件,如果您正在对 gridview 进行完全重新绑定,并且基础数据已更改,这可能会使页面上的“有效值”与回发中收到的不匹配。

取决于场景的一个选项是在这种情况下不使用回发,而是执行常规链接以刷新页面。或者,您可以按照建议执行 EnableEventValidation=false,但您需要额外确保您不依赖发送给客户端的任何值,即下拉列表可能包含不在您绑定的列表中的值。

于 2009-03-30T22:05:26.293 回答
0

每次遇到这个问题都是因为我使用客户端脚本来操作服务器端对象。这可以在从服务器调用脚本但客户端尝试通过回发运行脚本时找到;它会弹出错误。

最好只使用带有客户端脚本的客户端对象。

于 2021-02-04T20:28:00.340 回答
-1

我在创建 ASP.Net WebForm 并单击“提交”按钮时收到此错误。

HTML 是使用嵌套在标签中的标签创建的,浏览器将嵌套标签视为关闭 ASP.Net 表单。结果,__EVENTVALIDATION 隐藏字段位于表单之外,并且未发送到服务器。

从标记中清除嵌套标签解决了这个问题。

我知道您的问题已得到解决,但我希望这可以帮助遭受同样痛苦的人。

于 2014-07-31T12:47:05.717 回答