您的位置:首页 > 运维架构

用DropDownList实现Ajax无刷新省市三级联动中出现的错误

2011-03-03 00:44 676 查看
目标:用服务端控件DropDownList实现Ajax无刷新省市三级联动

省:<asp:DropDownList ID="ddlProvince" runat="server" EnableViewState="false"></asp:DropDownList>
市:<asp:DropDownList ID="ddlCity" runat="server" EnableViewState="false"></asp:DropDownList>
区:<asp:DropDownList ID="ddlCounty" runat="server" EnableViewState="false"></asp:DropDownList>

做法:

页面加载时首先加载“省”的数据,然后给市和区分别加上“请选择”的项,用JQuery的$.post()方法顺利的实现了AJax无刷新省市联动

问题:

但是发现在页面提交的时候后台读取不了DropDownList的值,而且提示出错:

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

在网上找了一下,发现很多人都遇到这种问题,有人列出了以下方法:

1、在页面的<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 中添加 EnableEventValidation="false" 就可以了。
2、是Form嵌套,一个页面只能有一个Form,仔细检查代码就可以解决。
3、如果页面含有 DropDownList 或 ListBox这样的控件,可能以下原因造成:
3.1 在下拉菜单中使用ajax,常见于省市联动菜单,可能是由于在aspx页面赋给了下拉菜单初始Item值,在事件回发时提示该错误,将下拉菜单初始Item值删除,在绑定事件中添加Item项。
3.2 原因是 DropDownList 控件的ListItem 的Value 属性 包含汉字.只要将Value 改为英文或数字的就行了.最好在web.config中添加如下语句:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>因为 POSTBACK 如果不采用 UTF-8 编码, JAVASCRIPT 会认为有问题。
只改 requestEncoding="utf-8" 就可以了,responseEncoding="utf-8" 不用
4、Register For Event Validation
其原理就是让asp.net记录这个postback value.
RegisterForEventValidation必须在render时调用.

但是试了以上的几种方法都不可用

第一种方法加了EnableEventValidation="false"后,页面不提示错误了,但是后台依然读取不了DropDownList的数据

最后解决方法:

(把DropDownList改为客户端Html控件select,然后用Ajax存储,肯定不会有错误,但是这里表单有很多需要提交的数据,所以不考虑用客户端Html控件)

1、在页面的<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 中添加 EnableEventValidation="false";

2、在页面添加隐藏域<input type="hidden" id="inputCity" runat="server" />,然后用JS将DropDownList选择后的值赋值给隐藏域,

这样后台就可以通过 inputCity.Value 来读取到隐藏域的值,也就是省市选择的值了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: