关于客户端改变ListBox的一个小问题
DotNet开发中,ListBox是个再熟不过的控件了,不过实际操作中却有一个场景,需要细细研究一下它
的特性.
在Ajax大行其道的今天,如果仅仅想借助客户端脚本(主要是javascript)改变ListBox的Item,然后再
提交到服务端处理,居然带出了一些小问题.因为服务端是通过页面viewstate里的值来跟踪包括ListBox
这类服务器控件的值的变化的,如果在客户端使得ListBox的内容改变了,而viewstate域里的值没有变化
的话,到了服务端仍然不能通过ListBox.SelectValue取得改变的值的.可是viewstate是加密后的字符串,
我们无法通过代码来更改它的.
参考了一些实例后,发现有两种途径能满足上述的需求.
一. 通过Form[ListBox]方式来访问,假设ListBox的ID命名为lb1,那么作为表单元素的访问方法,用
Request.Form[lb1]就能直接获取在客户端改变后,并选择中的ListBox中的值.但遗憾的是只能取到
ListBox中item的Value,而没办法得到item的Text的值.
二. 先斩后奏永远是王道.可以在客户端再动态添加一个<input type="hiden" runat="server">这
样的隐藏域,将客户端改变后的ListBox所有的Item以键值对的形式放在这个隐藏域里面,提交到服务端的
时候,把这个键值对取出来,将ListBox先clear所有的item,然后再按键值对重新添加ListBox的数据,这样
也就是保证了客户端和服务端的同步.也不存在方法一中取不到Item的text的值的问题了.因为是先有值,
再赋给ListBox的,这样操作虽然麻烦一些,但要灵活得多,对于喜欢JS的开发来说,均可以先变值再更新到
服务端的,建议能尝试用这样的方法.