首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
btbtd (83)
coofucoo (107)
longrujun (64)
cyz1980 (101)
ssll2826 (10)
EmilMatthew (73)
goodboy1881 (15)
superlmj (12)
feng19821209 (9)
yjz0065 (115)
CSDN - 文档中心 - .NET 阅读:3404   评论: 3    参与评论
标题   用户控件中使用客户端脚本的控件名称问题     选择自 chnking 的 Blog
关键字   用户控件 客户端控件名称
出处  

 

asp.net提供一种很好的模块级的复用技术――用户控件,大大方便了web网站的建设,提高了效率。用户控件使用多了,碰到的问题也会增多。最近遇到一个问题,就是如果在一个用户控件中要使用到客户端脚本,而这个客户端的脚本又要访问到控件中包含的控件,问题就出现了。问题是当一个用户控件被包含到一个aspx页面后,呈现到用户客户端后,整个用户控件中的控件的名称将会有所变化,它们不再是你设计这个用户控件时的名称,而是有两个相关的名称:

id ―― 客户端可以通过这个id访问这个客户端控件,asp.net给每个控件输出的id形式为“用户控件id_此控件的id”,如果是用户控件嵌套的情况,形式为“顶层用户控件id_下层用户控件id_此控件的id

name ―― 客户端也可以通过这个name来访问这个客户端控件,asp.net给每个控件输出的name“用户控件id:此控件的id”,如果是用户控件嵌套的情况,形式为“顶层用户控件id:下层用户控件id:此控件的id”。

 

例子:<input name="WebUserControl11:TextBox1" type="text" id="WebUserControl11_TextBox1" />

在设计用户控件时,放置了一个TextBoxidTexBox1,这个用户控件被放置到一个aspx页面,用户控件的idWebUserControl11,最后这个用户控件的TextBox到客户端后就是上面的这个样子的了。

 

客户端提交到服务端时是根据控件的name来提交的,也就是说,对服务端来讲,客户端的name是有意义的,id是不需要的。

在写客户端脚本时你不能预知你的用户控件将会是以什么id加入到aspx页面的,也不能预知用户控件被嵌套了多少层,所以你根本不能在设计时来参考这些控件。

幸好,asp.netwebcontrol htmlcontrol 的控件有个运行时属性 UniqueID,用来获取服务器控件的唯一的、以分层形式限定的标识符。对应到上面的那个例子,控件TextBox1UniqueID就是“WebUserControl11:TextBox1”,跟生成的客户端的控件的name相一致。

所以我们可以用控件的UniqueID来获得运行时客户端的name,也就能通过这个name来控制客户端控件了。

OK,按照这个思路来设计个客户端脚本:

用户控件很简单,就放置一个TextBox,我们再给这个TextBox设置一个鼠标经过事件来触犯客户端的脚本,给TextBox赋一个值,代码如下:

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="WebUserControl1.ascx.cs" Inherits="WebApplication3.WebUserControl1" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>

<asp:TextBox id="TextBox1" runat="server" onmouseover="over()"></asp:TextBox>

<script language=javascript>

<!--

function over()

{

   document.all.<%= TextBox1.UniqueID%>.value = "kent";

}

//-->

</script>

将这个用户控件拖放到一个aspx页面中,编译浏览这个页面,报一个脚本错误:缺少‘;’

把鼠标移到TextBox时,又报一个脚本错误:“缺少对象

 

检查发现,客户端引用的标示不能含有”:”符号,就是说在客户端不能用控件的name来参考。asp.netwebcontrol htmlcontrol 的控件还有个运行时属性 ClientID,它用来获取由 ASP.NET 生成的服务器控件标识符,也就是来获取控件的客户端id的,我们再改用这个属性来试一下:

 

document.all.<%= TextBox1.ClientID %>.value = "kent";

 

再运行,OK成功,当鼠标移动TextBox时,TextBox中出现了“kent”。


相关文章
对该文的评论
Suncanoe ( 2003-11-12)
经过测试,发现一个大问题,象这样的控件,一个webform中只能有一个,
不知对于这个问题,作者有什么好的解决方案?
等待ing......
Suncanoe ( 2003-11-04)
好,例子,短小,精湛。容易理解。好例子
gzy163991 ( 2003-10-07)
刚好要用到,谢谢