duohahawuwu~问题的价值

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  3 Posts :: 0 Stories :: 6 Comments :: 2 Trackbacks

2008年6月24日 #

如何在客户端取到服务器控件的ID呢,这个问题很久很久以前的古老程序要就说明了这个问题了,在如今的AJAX应用中我们也通过之前的这种解决办法解决了需要的问题,一个小小的ClientID搞定所有(我的第一篇Blog文件中有说明),无论控件是在自定义控件中还是在MasterPage中都可以通过ClientID轻松的获取到控件的ID。但是今天我却遇到了另外一个问题,上面的方法突然在radiobuttonlist这个控件中不能应用了。
下面就说说我遇到的情况
1
Q:问题出在哪里,为什么会这样
A:以前获取控件的值都是通过documeng.getElementById+ID来得到的,但是radiobuttonlist控件比较特殊,他的每一个项目都会存在不同的ID,而每个项目之间的关系是通过groupname来决定的,也就是说同一个groupname下的radio可以进行相互的互斥选择。问题出要出现在互斥上面。

2
Q:通常情况怎么解决
A:通常的情况我们是通过documeng.getElementByName来获取的radiobuttonlist的groupname然后再用循环判断哪一个项目被checked,最后判断出用户选择的是哪个项目。具体的代码如下(借用一下别人的代码)
 1<script language="javascript">     
 2function getRadio()   
 3{   
 4    var   opts   =   document.all("RadioButtonList1");
 5    if   (opts)   
 6    {   
 7        for   (var   i   =   0;   i   <   opts.length;   i++)   
 8        {   
 9            if   (opts[i].checked)   
10            {   
11                alert(i);   
12                break;   
13            }
   
14        }
   
15    }
   
16}
   
17</script>

3
Q:为什么通常的办法不行了呢?
A:为什么通常的方法不行了呢?原因就出在嵌套上面,尤其是在用到masterpage的页面中,获取radiobuttonlist在客户端的name值就变得非常的不容易了

4
Q:如何来解决
A:上面说明了问题,最后说说怎么来解决吧,解决的方法一共有三种(我找到的,可能还有我没有找到的更好的方法)
a)通过手动替换ID值来获得Name值
这个方法的意思就是还是和以前一样通过ClientID来获取控件的ID,然后对ID值进行一下加工处理就可以得到Name值了,具体的方法如下
<span id="ctl00_ContentPlaceHolder1_RadioButtonList1"><input id="ctl00_ContentPlaceHolder1_RadioButtonList1_0" type="radio" name="ctl00$ContentPlaceHolder1$RadioButtonList1" value="1" /><label for="ctl00_ContentPlaceHolder1_RadioButtonList1_0">1</label><input id="ctl00_ContentPlaceHolder1_RadioButtonList1_1" type="radio" name="ctl00$ContentPlaceHolder1$RadioButtonList1" value="2" /><label for="ctl00_ContentPlaceHolder1_RadioButtonList1_1">2</label></span>

上面的代码显示的是一个radiobuttonlist生成HTML的源文件,可以看出来id和name是那么的相似,一个是ctl00_ContentPlaceHolder1_RadioButtonList1一个是ctl00$ContentPlaceHolder1$RadioButtonList1,区别就在于一个是用_来组合一个使用$来组合,所以我们获得ID以后用一下replace就可以轻松的获取到相应的Name值。得到了Name值就可以通过上面的传统方法来获取你想知道的内容了,嘿嘿
但是这个方法也存在一个问题,就是你的控件名称不能包含有_符号,如果存在的话这个方法反而会带来麻烦

b)通过radiobuttonlist中的项目ID来获取相应的值
这个方法比较简单了,继续观察上面的HTML源文件,可以看出来radiobuttonlist的每个项目的命名都是有规律的,第一项的ID结尾时0,第二项的ID结尾时1,以此类推,至于之前的名字就是控件的ClientID,这样你也可以通过循环来得到哪个项目被选中了

C)最后一个方法在我来看是一种比较好玩的办法,不过可能一般人还是不太容易接受的,因为这个方法会产生HTML的编译错误(不是后台的编译错误,不影响运行),不过这个方法确实是一个聪明的方法。下面就贴出来具体的代码
1<asp:radiobuttonlist id="RadioButtonList1" runat="server" repeatdirection="Horizontal" repeatlayout="Flow">
2            <asp:listitem value="1" onclick="setvalue('1')">1</asp:listitem>
3            <asp:listitem value="2" onclick="setvalue('1')">2</asp:listitem>
4        </asp:radiobuttonlist>

嘿嘿,看到上面代码的不同了吗?对,就是在listitem中添加onclick客户端事件,这样每次onclick都可以确定哪个项目被选了,嘿嘿,我真的觉得这个方法很好玩。
不过这个方法也存在问题,问题就在于当你用数据绑定项目的时候会出现问题,主要不好控制onclick的内容。

上面3个方法是我今天找到的,写到这里的时候我又搜索到了一种方法,感觉也很好,贴出来大家看看
 1 function togglePannelStatus(content)
 2    {
 3        var ListControl = document.getElementById( "<%=RdoLstYear.ClientID%>" ) ;
 4        var options = ListControl.getElementsByTagName( 'label' ) ;
 5        for( i=0 ; i < options.length ; i++ )
 6        {
 7              options[ i ].innerText = '2004' ;
 8        }

 9}

10

总之这个问题还是不难的,不过自己想想一个取值就这么多种方法,还真的挺好玩的,嘿嘿。

好了,今天到这里了,这两天遇到的问题也都差不多说出来了,希望可以帮助到以后遇到这些问题的人,嘿嘿
posted @ 2008-06-24 23:33 duohahawuwu 阅读(1451) | 评论 (6)编辑

继续项目中遇到的问题,这次是Javascript的问题了,一般的情况下我们写下面这些代码来修改一张图片的现实内容
Code
其实这样写从语法上面来讲是没有问题的,但是有的时候却不能正常的显示出图片,可是图片却明明的存在,地址也没有错误,为什么呢?
1<href="javascript:void(0);" onclick="ChangePic();">换图</a>
问题就出现在上面这句话的void(0);如果把上面的那些代码修改为
1<img id="TestImg" src="http://duoduosuki.wt199.gvk.cn/TaobaoImages/1a71161c-6137-47b2-ba6d-2b39b0ff3a86.jpg" />
2        <href="javascript:ChangePic();">换图</a>
3        <script type="text/javascript" language="javascript">
4        function ChangePic()
5        {
6            document.getElementById("TestImg").src = "http://duoduosuki.wt199.gvk.cn/TaobaoImages/738ee3c3-a3a3-438c-b6e0-c13bec51e3ea.jpg";
7        }

8        
</script>
就不会出现这样的问题
目前的解释可以认为是void(0)取消了图片加载的事件,所以如果涉及到图片的切换的时候需要注意这个问题。
同时这样的情况也存在于用innerHTML来替换图片的情况中。

但是也有人说是IE浏览器的问题,具体的我没有试验过,其实我到真的希望是这样,至少可以和客户解释为这个是IE的bug了,嘿嘿
posted @ 2008-06-24 22:48 duohahawuwu 阅读(176) | 评论 (0)编辑

还是最近项目发生的问题,ASP.NET做URL重写就我所知有两种方法,一种就是用.NET自己的,也就是修改通配符这样的形式,然后再WebConfig中配置相应的正则表达式,还有一种方法就是用过第三方的东西来实现,这次我就用到了ISAPI_Rewrite这个东西。其实我感觉还是第三方的比较好,主要是比较容易
下面就说说遇到的具体的配置和一些问题
1
Q:ISAPI_Rewrite的版本选择
A:ISAPI_Rewrite有两种版本一种是免费的Lite版本,还有一种就是收费的叫Full什么的,好像主要的区别在于反向代理,其实具体什么是反向代理我也不太明白没有具体的深究过,总是一般的情况下Lite版本就足够了

2
Q:如何安装
A:安装是非常的简单的,下一步下一步下一步就可以了,需要注意的是最好重新启动一下IIS。

3
Q:怎么用?
A:这里需要好好的说说了,在安装完ISAPI_Rewrite以后,并且重启IIS后,在IIS的网站里面(不是你添加的子站点,就是那个网站根节点)就已经启动了ISAPI_Rewrite,可以看到一个上向的绿色箭头。当然更多的时候你是不需要在整个IIS网站下面都加入ISAPI_Rewrite的,所以你需要在你的子网站下面添加相应的ISAPI。在不删除默认的IIS网站里面的ISAPI_Rewrite的情况下你在子网站所添加的ISAPI_Rewrite的优先级都会变成??,这里需要注意。添加好ISAPI后接下来就是怎么来做URL的重定向了。在安装的目录下面有一个叫http什么.ini的文件(2.X的版本是这个文件,3.X也叫http什么的同时后缀有些不一样),修改这个文件来达到URL重写,这里去需要注意的是这个ini文件只能放在安装目录下面不能放在什么网站的根目录下面,我当初就是把他放在网站的根目录下面,然后怎么修改正则表达式也不行。

4
Q:如果写正则表达式
A:这个问题,嘿嘿,其实我也不太懂,一般我都是按照别人写的来修改,不过这里需要注意的一个情况就是正则表达式的顺序,尤其是对同一页面不同情况的解释需要注意,下面回贴出一段正则表达式,表达式的先后顺序不同实现的效果也会不同,需要注意!

posted @ 2008-06-24 22:35 duohahawuwu 阅读(188) | 评论 (0)编辑

2008年6月19日 #

     摘要: 之前一直在看AJAX的东西,主要是老赵的文章和视频,但是一直就没有真正的实战过,今天手头的项目终于可以用到了,但是在理论界和实际的时候却出现了很多很多的问题。目标:实现ScriptManager+Javascript+WebService == AJAX效果步骤:1.建立模板页2.添加内容也3.拖入ScriptManager4.在ScriptManager中添加WebService的地址5.在内容... 阅读全文
posted @ 2008-06-19 00:59 duohahawuwu 阅读(87) | 评论 (0)编辑