vs2005下,"回发或回调参数无效"的解决方法
vs2005下,"回发或回调参数无效"的解决方法
还是前几天发现的问题,原来在vs2003下使用的ajax无刷新联动代码,放到vs2005的项目后就会出现错误
回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是
在网上找到几种解决方案
1.将<pages enableEventValidation="true"/>改为<pages enableEventValidation="false"/>,但是这样取不到客户端增加的值。
2.将dropdownlist的value值设为数字或者英文,不要使用中文。我尝试了一下,没有成功。
3.使用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,将由脚本加入控件中的值加入到隐藏值中,就不会出现找不到相应信息的错误了。使用这个方法后,取数据时使用Request.Form("DropDownList2")取值.