4

I have an ASP.net application that works fine in the development environment but in the production environment throws the following exception when clicking a link that performs a postback. Any ideas?

Invalid postback or callback argument. Event validation is enabled using 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.

Edit: This seems to only be happening when viewed with IE6 but not with IE7, any ideas?

4

5 回答 5

2

问题描述:这是很多 ASP.NET 初学者面临、发帖和询问的常见问题之一。通常,他们会发布如下错误消息并寻求解决方案,而不会分享他们正在尝试做的事情。

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

虽然,错误堆栈跟踪本身建议通过关闭事件验证来快速解决,但它不是推荐的解决方案,因为它会打开一个安全漏洞。知道它发生的原因以及如何解决/处理该根本问题总是很好的。

评估:进行事件验证以验证事件的起源是否是相关的呈现控件(而不是一些跨站点脚本左右)。由于控件在渲染期间注册其事件,因此可以在回发或回调期间验证事件(通过 __doPostBack 的参数)。这降低了未经授权或恶意回发请求和回调的风险。

参考:MSDN:Page.EnableEventValidation 属性

基于上述情况,我在讨论中遇到或听到的可能引发问题的场景是: 案例 #1:如果我们在请求数据中有尖括号,看起来某个脚本标签正在传递给服务器。

可能的解决方案:HTML 在提交表单之前借助 JavaScript 对尖括号进行编码,即替换“<” 用“<” 和“>”与“>”</p>

function HTMLEncodeAngularBrackets(someString)
{
var modifiedString = someString.replace("<","&lt;");
modifiedString = modifiedString.replace(">","&gt;");
return modifiedString;
}

案例#2:如果我们编写的客户端脚本在运行时更改客户端中的控件,我们可能会遇到一个悬空事件。一个示例可能是具有嵌入式控件,其中内部控件注册回发但由于在外部控件上执行的操作而在运行时隐藏。这是我在 Carlo 写的 MSDN 博客上读到的,在寻找相同的问题时,因为有多个表单标签。

可能的解决方案:在页面的 Render 方法中手动注册事件验证控件。

protected override void Render(HtmlTextWriter writer)
{
ClientScript.RegisterForEventValidation(myButton.UniqueID.ToString());
base.Render(writer);
}

如前所述,报告的另一种常见情况(看起来属于同一类别)是构建一个页面,其中一个表单标记嵌入在服务器上运行的另一个表单标记中。删除其中一个可以更正流程并解决问题。

案例#3:如果我们在每次回发时在运行时重新定义/实例化控件或命令,则可能会遇到相应/相关的事件。一个简单的示例可能是在每个页面加载(包括回发)上重新绑定数据网格。因为,在重新绑定网格中的所有控件时,都会有一个新的 ID,因此在由 datagrid 控件触发的事件期间,回发时控件 ID 会发生更改,因此事件可能无法连接到正确的控件,从而引发问题。

可能的解决方案:这可以通过确保不会在每次回发时重新创建控件来简单地解决(在此处重新绑定)。使用 Page 属性 IsPostback 可以轻松处理它。如果您想在每个回发上创建一个控件,那么有必要确保 ID 没有更改。

protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostback)
{
// Create controls
// Bind Grid
}
}

结论:如前所述,一个简单/直接的解决方案可以在 Page 指令或 Web.config 文件中添加 enableEventValidation=”false”,但不推荐。根据实施和原因,找到根本原因并相应地应用解决方案。

于 2014-09-24T09:04:41.427 回答
1

如果您发布的内容可能是恶意的,就会发生这种情况;例如其中包含 html,但在回发之前未编码的文本框。如果您允许提交 html 或脚本,则需要对其进行编码,以便将 < 等字符作为 & lt; 传递。

于 2008-09-19T17:10:34.487 回答
0

当回发发生时,页面上的数据/控件似乎发生了变化。如果您在页面指令中关闭事件验证会发生什么。

<%@ Page ... EnableEventValidation = "false" />
于 2008-09-19T16:45:40.037 回答
0

<form>只有当我的页面中有嵌套标签时,我才会得到这个。IE6 将查看嵌套的表单标签并尝试在这些表单以及主 ASP.NET 表单中发布值,从而导致错误。其他浏览器不会发布嵌套表单(因为它是无效的 HTML)并且不会收到错误消息。

您当然可以通过执行 来解决此EnableEventValidation = "false"问题,但这可能意味着您发布的值和视图状态存在问题。最好先清除嵌套<form>标签。

还有其他可能出现这种情况的地方,例如表单字段中的 HTML 式值,但我认为这些错误消息更具体。在抛出此问题的通用回发中,我只需检查呈现的页面是否有额外的<form>标签。

于 2008-11-10T19:27:50.707 回答
0

当我手动输入文本时,我有一个工作正常的 ListBox,但是当我根据 SQL 查询输入数据时,列表中的最后一项会引发此异常。我搜索了所有的问答,没有一个符合我的问题。

就我而言,问题是 SQL 数据中有一个不可打印的字符 (\r)。我猜测服务器基于不可打印字符的存在创建了一个哈希码,但它已从实际显示在 ListBox 中的字符串中删除,因此第二个哈希与第一个不匹配。在将字符串放入 ListBox 之前清理字符串并删除不可打印的字符解决了我的问题。

这可能是一个超级边缘案例,但我想添加它只是为了完成(并希望帮助其他人不要花 2 天时间发疯)。

于 2017-04-09T19:48:01.487 回答