无效的回发或回调参数

时间:2009-03-30 20:42:50

标签: .net postback callback modal-dialog event-validation

这个问题似乎以前曾被问过,但我觉得我的情况略有不同。

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

  

无效的回发或回调参数。   使用in启用事件验证   配置或在页面中。对于   安全目的,这个功能   验证回发的参数或   回调事件源于   最初的服务器控件   渲染它们。如果数据有效   并期望,使用   ClientScriptManager.RegisterForEventValidation   注册方法   回发或回调数据   验证

真正令我烦恼的是,我在不同的页面上使用这个完全相同的逻辑,它运行正常。

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

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

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

在页面指令中尝试此行,一旦出现类似错误,就会解决错误

EnableEventValidation="false"

问候!!!

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

创建ASP.Net WebForm时出现此错误,然后单击“提交”按钮。

使用嵌套在标记内的标记创建HTML,浏览器将嵌套标记视为关闭ASP.Net表单。因此,__ EVENTVALIDATION隐藏字段位于表单之外,而不是发送到服务器。

清除标记中的嵌套标记解决了问题。

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