悬赏园豆:200
[已关闭问题]
关闭于 2008-06-02 12:09
<P><FONT size=2>各位老大们,我实在是无语,快疯了,你们帮我解决解决吧/</FONT></P>
<P><FONT size=2>问题是这样的:在asp.net里面用了ajax技术实现联动的下拉列表,用的控件是asp服务器控件dropdownlist,动态更新了里面的内容后,在提交的时候提示"</FONT></P>
<P><FONT size=2><EM>回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。</EM></FONT></P>
<P><FONT size=2>,设置<EM>EnableEventValidation="false"的话,</EM>在cs页面的button_click事件里面就取不到控件dropdownlist的值了,网上说的很多方法我认为都不是根本上解决问题的方法,谁能给我讲讲到底怎么办?为什么?是什么原理?谢拉!!!</FONT></P>
问题补充:
补充:把asp控件换成html应该可以,但我不想这么做,就想用asp服务器控件搞定这个问题,谁解决了就把我所有的专家分全给他了!还有网上的那些方法基本我都试过了,没一个好使得
以下提到的解决方法全都没用,别再回这些方法了
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,将由脚本加入控件中的值加入到隐藏值中,就不会出现找不到相应信息的错误了。