回发或回调参数无效

回发或回调参数无效

问题描述:

我有一个ASP.net应用程序在开发环境中正常工作,但在生产环境中单击执行回发的链接时会引发以下异常。有任何想法吗?回发或回调参数无效

回发或回调参数无效。 在配置中使用 或 页面中的EnableEventValidation =“true”%>启用了事件验证。为了安全起见,此 功能验证参数 回发或回调事件从 最初呈现它们的服务器控件发起 。如果数据 有效并且是预期的,请使用 ClientScriptManager.RegisterForEventValidation 方法来注册 回发或回调数据以验证 。

编辑:这似乎与IE6查看时,但不与IE7,任何想法只能是这样吗?

+0

你在页面上使用ASP.Net AJAX吗? – JasonS 2008-09-19 16:47:04

+0

是的我正在使用ASP.NET AJAX – jwarzech 2008-09-22 14:04:22

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

<%@ Page ... EnableEventValidation = "false" /> 

这可以,如果你发布这似乎是可能的恶意的事情发生;例如其中包含html的文本框,但在回发之前不进行编码。如果您允许提交html或脚本,则需要对其进行编码,以便将字符(如<)作为& lt ;.

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

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

还有其他一些地方可能会出现这种情况,例如表单字段中的HTML-esque值,但我认为这些错误消息更具体。在引发这个问题的通用回传中,我只需检查呈现的页面以获取额外的<form>标签。

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

[ArgumentException:回发或回调参数无效。事件验证在配置中启用,或在页面中启用<%@ Page EnableEventValidation =“true”%>。为了安全起见,此功能验证回发或回调事件的参数来自最初呈现它们的服务器控件。如果数据有效且预期,请使用ClientScriptManager.RegisterForEventValidation方法为注册回发或回调数据进行验证。]

虽然错误堆栈跟踪本身通过设置eventvalidation来提示快速解决方案,但它不是推荐的解决方案,因为它会打开一个安全漏洞。知道为什么会发生以及如何解决/处理根本问题总是很好的。

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

参考:MSDN:Page.EnableEventValidation物业

此基础上,我已经遇到或听说引发讨论问题的可能方案是: 案例#1:如果我们在请求数据尖括号,它看起来像一些脚本标记正在传递给服务器。

可能的解决方案: HTML编码的JavaScript的帮助下角括号提交表单之前,即以“>”

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 
} 
} 

结论: 如所述,一个简单的/直接溶液可以添加enableEventValidation =在Page指令或Web.config文件”假”,但不推荐。根据实施情况和原因,找出根本原因并相应地应用分辨率。

我有类似的事情发生,当我手动输入文本时工作正常,但当我输入基于SQL查询的数据时,列表中的最后一项会抛出此异常。我搜查了所有Q & A,没有与我的问题相符。

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

这可能是一个超级边缘案例,但我想添加这只是为了完成(并希望可以帮助别人不花2天疯狂)。