ajax 回发或回调参数无效,asp.net 回发或回调参数无效的各种情况分析及解决办法...

昨天,在实现级联菜单的时候,突然出现一下错误:

回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。

我们先看提示在配置中使用 或在页面中使用 启用了事件验证 这句话说我们设置了 enableEventValidation 属性,设置的值为 true ,也就是启用了事件验证,那是不是也可以禁用该事件呢?将enableEventValidation 属性设置为 false 后再运行程序,会发现错误没有了,那是不是问题就解决了呢? 可能有的人设置false后问题解决了,可能有的人设置false之后,该问题解决了却引发了连带问题。事件验证 又是怎么一回事呢?

MSDN的说明是:

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

通过此模型,控件可在呈现期间注册其事件,然后在回发或回调期间验证这些事件。默认情况下,ASP.NET 中的所有事件驱动控件均使用此功能。

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

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

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

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中,它看起来可能是这样的 当我们选择省市的DropDownList 并提交时,在 DropDownList 的 LoadPostData 事件中会验证提交的内容与 id 为 __EVENTVALIDATION 的 hidden 的Value ,因为之前市的DropDownList 并没有项,可是提交的时候我们给它加了若干项而事件验证机制不知道,它会判断出提交的数据不是预期的是未经授权的、是无效的,也就会报出本文的错误了。那如何解决也就明确了,只要 我们告诉事件验证机制那些数据是有效的问题也就迎刃而解了。

解决方法:

在做级联菜单的时候可以将DropDownList控件替换成select,如:

UI-->

C#-->

string cityName = this.ddCity.SelectedItemValue;

替换为:

UI-->

C#—>

string cityName = Request[this.ddlCity.UniqueID]

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

随机推荐

Digester组件

刚认识Digester,记录一下: Digester随着Struts的发展以及其的公用性而被提到commons中独自立项,是apache的一个组件 apache commons-digester.ja ...

lua table 排序--满足多条件排序

前提 假设 一个小怪 有三种属性,等级(level).品质(quality).id(pid) 我们需要对他们进行排序,两种排序情况,第一是单一属性排序,比如按照等级进行排序,或者多种属性进行优先级排序 ...

采用EntLib5.0(Unity+Interception+Caching)实现项目中可用的Caching机制

看了园子里很多介绍Caching的文章,多数都只介绍基本机制,对于Cache更新和依赖部分,更是只简单的实现ICacheItemRefreshAction接口,这在实际项目中是远远不够的.实际项目中, ...

[Java] 对象排序示例

package test.collections; import java.util.ArrayList; import java.util.Collection; import java.util. ...

Nginx - Configuration File Syntax

Configuration Directives The Nginx configuration file can be described as a list of directives organ ...

js的for循环闭包问题

一个简单的例子,如果想循环输出数组中的每一个数值我们可以利用for循环来输出例如:

【Python爬虫】BeautifulSoup网页解析库

BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

[午间休息] - 午间codewars活跃脑袋

https://www.codewars.com/kata/51f2b4448cadf20ed0000386/javascript 中午是一个易困的时间段.如果其它人不睡觉还好. 这个js题目就是说如 ...

扩展LV手记

情景概览 系统:CentOS Linux release 7.4.1708 (Core) 磁盘情况: 目标:将sda3扩展到sda2下的centos-root虚拟盘上 操作步骤 1.建立新的PV # ...

JavaScript面向对象(封装)

阮一峰的网络日志 1.生成实例对象的原始模式 var People = { name : '', age : '' } 根据这个原型对象生成两个实例对象 var people1 = {}; peopl ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值