您的位置:首页 > 编程语言 > ASP

Asp.net2.0回发或回调参数无效问题的解决

2008-04-16 11:50 302 查看
详细错误:回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。

出现这种情况的原因很多,我总结了一下,解决方法有如下几种:

1、.将<pages enableEventValidation="true"/>改为<pages enableEventValidation="false"/>,但是这样取不到客户端增加的值。

2、Form嵌套,一个页面只能有一个Form,仔细检查代码就可以解决。

3、在下拉菜单中使用ajax,常见于省市联动菜单,可能是由于在aspx页面赋给了下拉菜单初始Item值,在事件回发时提示该错误,将下拉菜单初始Item值删除,在绑定事件中添加Item项。

4、把GridView绑定数据那块放进if(!Page.IsPostBack)里~~~就行啦~~,呵呵

5、.将dropdownlist的value值设为数字或者英文,不要使用中文。
或者在web.config中添加如下语句:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

6、使用RegisterForEventValidation注册客户端控件的值。

可能还有别的方法,不过我没有注意到。我是参考的第三种方法实现的。

解决方法:在Page_Load之前加入如下代码

protected override void Render(HtmlTextWriter writer)

{

ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "argument");

base.Render(writer);

}

DropDownList1就是你要使用客户端脚本动态增加内容的控件,而argument就是你要加入的值。例如本来DropDownList1是空的,你用脚本为它增加了“中国”,“美国”等值,这里的代码就改成

ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "中国");

ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "美国");

原理:就是因为vs2005的这个数据验证问题了,"在asp.net render DropDownList 时,会遍历DropDownList的item,并记录所有可能的postback的值,计算的结果会被保存在page中,

<input type="hidden"

name="__EVENTVALIDATION"

id="__EVENTVALIDATION"

value="/wEWBQKGg9abDQKd9sHMBgKc9s…….."

/>

这个过程发生在control的Render()方法中

当页面postback时,ASP.NET会根据这个隐藏值检查postback values,如果找不到对应信息,就会报错"(引自http://recordsome.blogsome.com/2006/05/

所以我们重写Render,将由脚本加入控件中的值加入到隐藏值中,就不会出现找不到相应信息的错误了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: