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


======================================================
注:本文源代码点此下载
======================================================

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^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值