回发或回调参数无效的各类状况分析及解决办法 回发或回调参数无效的各类状况分析及解决办法

http://www.cnblogs.com/ajian/archive/2010/01/13/1646402.htmlhtml

 

回发或回调参数无效的各类状况分析及解决办法

 

今天,在实现级联菜单的时候,忽然出现一下错误:ajax

回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。若是数据有效而且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。安全

咱们先看提示在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证 这句话说咱们设置了 enableEventValidation 属性,设置的值为 true ,也就是启用了事件验证,那是否是也能够禁用该事件呢?将enableEventValidation 属性设置为 false 后再运行程序,会发现错误没有了,那是否是问题就解决了呢? 可能有的人设置false后问题解决了,可能有的人设置false以后,该问题解决了却引起了连带问题。事件验证 又是怎么一回事呢?服务器

MSDN的说明是:异步

此事件验证机制可下降未经受权的回发请求和回调带来的风险。当EnableEventValidation 属性设置为 true 时,ASP.NET 仅容许在回发请求或回调期间可由控件引起的事件。post

经过此模型,控件可在呈现期间注册其事件,而后在回发或回调期间验证这些事件。默认状况下,ASP.NET 中的全部事件驱动控件均使用此功能。this

强烈建议不要禁用事件验证。若是确实须要禁用事件验证,请确保不会构造出对应用程序产生意料以外影响的回发。url

在大多数状况下,请经过在 Web.config 文件中设置 @ Page 指令的 enabledEventValidation 属性 (Attribute) 或页元素的 enableEventValidation 属性 (Attribute) 来设置 EnableEventValidation 属性 (Property)。若是在代码中设置 EnableEventValidation 属性,则在页处理的 Page_Init 阶段进行设置。spa

出现此类错误的Case有如下几种:orm

1.From的嵌套集解决方法

首先一个页面是能够有多个Form的,可是只能有一个Form 被标记为 runat="server" 
而且多个Form不能够嵌套。 那Form 嵌套会不会引发本文这个错误呢?我试了几回都没有出现本文的错误。 
但若是Form 没加载完毕的时候提交Form则会出现本文的错误,不过这与Form 嵌套无关。

2.if(!this.Page.IsPostBack)

这个错误包括不少种状况,须要视状况而定。

3.级联菜单

缘由分析:

ajax应用中包含下拉列表框(DropDownList)是出现这个错误频率最高的Case了,那为何会这样呢?是否像网上所说的那 样呢?实则否则,先让咱们看下ajax应用中的下拉列表框作了那些事,常见的是省市联动的ajax应用,市的下拉列表框在页面加载后是没有内容的,是根据 用户选择的省 异步向服务器请求而后将响应解析以后加载到市的下拉列表框中,而后提交。当提交的时候本文的错误就出现了,那提交的时候作了什么事出现了这个错误呢?原来在页面呈现的时候,DropDownList 的 render 事件,会遍历 DropDownList 每一项的Value 属性,与 DropDownList 的UniqueID 属性 hash 以后作 XOR 并将结果保存到页面中。保存在 id 为 __EVENTVALIDATION 的 hidden中,它看起来多是这样的 <input type="hidden" id="__EVENTVALIDATION" name= "__EVENTVALIDATION" value="/wEWBQKGg9abDQKd9sHMBgKc9s........" /> 当咱们选择省市的DropDownList 并提交时,在 DropDownList 的 LoadPostData 事件中会验证提交的内容与 id 为 __EVENTVALIDATION 的 hidden 的Value ,由于以前市的DropDownList 并无项,但是提交的时候咱们给它加了若干项而事件验证机制不知道,它会判断出提交的数据不是预期的是未经受权的、是无效的,也就会报出本文的错误了。那如何解决也就明确了,只要 咱们告诉事件验证机制那些数据是有效的问题也就迎刃而解了。

解决方法:

在作级联菜单的时候能够将DropDownList控件替换成select,如:

UI-->

<asp:DropDownList id=”ddlCity” runat=”server”>

</asp:DropDownList>

C#-->

string cityName = this.ddCity.SelectedItemValue;

替换为:

UI-->

<select id=”ddlCity” runat=”server”>

</select>

C#—>

string cityName = Request[this.ddlCity.UniqueID]

4.是 DropDownList 控件的ListItem 的Value 属性 包含汉字.只要将Value 改成英文或数字的就好了。

相关文章
相关标签/搜索