您的位置:首页 > 编程语言 > ASP

Asp.net ajax 1.0 绑定drowdownlist时取值问题

2012-01-15 03:39 399 查看
======================================================

注:本文源代码点此下载

======================================================

asp.net ajax 1.0 绑定drowdownlist时取值问题
今天同事使用了很久远的一个东西。。asp.net ajax 1.0,然后使用了 updatepanel来实现drowdownlist的联动,结果出了问题,有个ddl取值selectitem.text总是默认值,于是乎让我帮忙,本想说让同事用其它类似jquery的库,但是同事在编程方面属于刚入门,但是活儿却要急着出来,唉,用了就用了吧,可是咱一过去帮忙调试,调试了1个半点,才把问题找出来。。。。期间google了问题,但是答案都没有比较明确的解释。。可能是这个东西(asp.net
ajax)真的该被抛弃了吧,但是对于新手要出活儿来说确实还是有点实用的。。。所以在此记录下来吧
在updatepanel中的drowdownlist是使用数据源绑定过去的,但是不管怎么设置,类似autopostback,ispostback啊什么之类的updatepanel的postmodel啊检查了没问题啊,但是就是不管事儿。调试时断点内的ddl的selectitem.text的值总是默认值。。。。郁闷啊。。。,这时想着用其它方式解决吧。。。。于是乎使用了
request["clientid"].tostring()
来取值,或者在页面内放置一个hidden,然后用javascript来更新hidden的值,在后台取这个hidden的值,这个时候问题能解决,但是本着找出问题的原因的精神,我们来探索原来哪里写的有问题,没道理的啊。
经过了一段时间的排查,发现了同事绑定drowdownlist控件时,在绑定完时再
drowdownlist.item.insert(0,new listitem("全部","0"));
,而且只指定了 datatextfield而没有指定 datavaluefield;
然后我们就把datavaluefield加上,这个时候终于找到原因了,对,就是drowdownlistlist在使用updatepanel来异步操作时,value值必须是唯一的,否则text值会有问题,其实这个问题不管是不是使用updatepanel都应当值的注意,因为 drowdownlist生成的select页面控件的value就是一个唯一值,你绑定时若不指定,它所有的value应该都是空,这个时侯是取不到selectitem的,包括selectindex都取不到。
由于有园友提出了想知道具体环境,这里给出具体代码
aspx部分




view
code
@ page language="c#" autoeventwireup="true" codebehind="default.aspx.cs" enableeventvalidation="false"
inherits="testnet2._0._default"%>
@ register assembly="system.web.extensions, version=1.0.61025.0, culture=neutral, publickeytoken=31bf3856ad364e35"
namespace="system.web.ui" tagprefix="asp" %>
doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
html xmlns="http://www.w3.org/1999/xhtml">
head runat="server">
title>testtitle>
script type="text/javascript">
window.onload = function () {
alert("已回发");
}
script>
head>
body>
form id="form1" runat="server">
asp:scriptmanager id="scriptmanager1" runat="server">
asp:scriptmanager>
asp:updatepanel id="up1" runat="server" updatemode="always">
contenttemplate>
asp:dropdownlist id="ddl1" runat="server" autopostback="true" onselectedindexchanged="ddl1_selectchanged">
asp:dropdownlist>
asp:label id="lbl1" runat="server">asp:label>
contenttemplate>
asp:updatepanel>
form>
body>
html>
cs部分




view
code
using system;
using system.collections.generic;
using system.web;
using system.web.ui;
using system.web.ui.webcontrols;
using system.data;
namespace testnet2._0
{
public partial class _default : system.web.ui.page
{
protected void page_load(object sender, eventargs e)
{
if (!ispostback) {
bindlist();
}
}
private void bindlist()
{
datatable dt = new datatable();
dt.columns.add("name");
for (int i = 0; i10; i++) {
datarow dr = dt.newrow();
dr["name"] = "测试" + i.tostring();
dt.rows.add(dr);
}
this.ddl1.datasource = dt;
this.ddl1.datatextfield = "name";
this.ddl1.databind();
this.ddl1.items.insert(0, new listitem("全部", "0"));
}
protected void ddl1_selectchanged(object sender,eventargs e)
{
this.lbl1.text = ddl1.selecteditem.text + ":" + ddl1.selectedindex.tostring();
}
}
}
web.config部分




view
code
xml version="1.0"?>
configuration>
appsettings/>
connectionstrings/>
system.web>
httphandlers>
remove verb="*" path="*.asmx"/>
add verb="*" path="*.asmx" validate="false" type="system.web.script.services.scripthandlerfactory, system.web.extensions, version=1.0.61025.0, culture=neutral, publickeytoken=31bf3856ad364e35"/>
add verb="*" path="*_appservice.axd" validate="false" type="system.web.script.services.scripthandlerfactory, system.web.extensions, version=1.0.61025.0, culture=neutral, publickeytoken=31bf3856ad364e35"/>
add verb="get,head" path="scriptresource.axd" type="system.web.handlers.scriptresourcehandler, system.web.extensions, version=1.0.61025.0, culture=neutral, publickeytoken=31bf3856ad364e35"
validate="false"/>
httphandlers>
httpmodules>
add name="scriptmodule" type="system.web.handlers.scriptmodule, system.web.extensions, version=1.0.61025.0, culture=neutral, publickeytoken=31bf3856ad364e35"/>
httpmodules>
compilation debug="true">
assemblies>
add assembly="system.web.extensions, version=1.0.61025.0, culture=neutral, publickeytoken=31bf3856ad364e35"/>
assemblies>
compilation>
authentication mode="windows"/>
globalization requestencoding="gb2312" responseencoding="gb2312" fileencoding="gb2312" culture="zh-cn" uiculture="zh-cn"/>
system.web>
configuration>
最后在自己测试过程中发现出现这个问题的真正原因:
由于在web.config中指定了页面编码"gb2312",而 asp.net ajax1.0使用的是utf-8的编码,回传数据时如果数据带有中文字符,则会出现乱码,乱码情况可以通过调试使用request[“clientid”]发现,因此则不能识别到item的值,[因此只要将编码设置为utf-8即可,只设置datatextfield也是可以取得值的]。
标签:
asp.net
绿色通道:好文要顶关注我收藏该文与我联系



posted @ 2011-04-18 21:18
超级奶崽 阅读(124)
评论(2)编辑
收藏
发表评论
2074819
回复 引用 查看
#1楼 2011-04-18 21:51 快乐的企鹅

楼主,我不敢同意“这个东西(asp.net ajax)真的该被抛弃”之说。我写了一个测试程序,在updatepanel中放了三个控件,dropdownlist、button和label,并添加了button的click事件,当我只绑定datatextfield时,发现可以获取到dataitem,且dataitem.text和dataitem.value的值相同,没有找到楼主所说的datatextmember,我用的是vs
2010,asp.net 4.0,不知楼主所讲是什么环境。
回复 引用 查看
#2楼[楼主] 2011-04-19 09:01 超级奶崽

@快乐的企鹅
是datatextfield和datavaluefield这两个值
我写这篇博文的时候是凭着自己记忆写的,具体的属性名记得不是特别清楚,现已将博文中的错误属性名改好了
我说的是asp.net ajax1.0 这点在文中已经说了,具体的你可以去试试。。。。:)
注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页
首页博问闪存新闻园子招聘知识库
最新it新闻:
·ios 5.1 beta3文件预示未来 siri有可能支持 ipad和 ipod touch
·android平台12月广告浏览份额51.6% 超越ios
·测试版ios源代码显示ipad 3或将支持siri
·斯蒂芬·霍金的新电脑
·京东商城2.95亿竞得北京商业地一块
»
更多新闻...
最新知识库文章:
·javascript 面向对象编程
·持续集成之“everything is code”
·持续集成之“软件自我识别”
·持续集成之戏说check-in dance
·什么是闭包。

我的理解
»
更多知识库文章...



china-pub 2011秋季教材巡展
china-pub 计算机绝版图书按需印刷服务

======================================================

在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: