惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
博客园 - Franky
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
月光博客
月光博客
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
爱范儿
爱范儿
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
云风的 BLOG
云风的 BLOG
MyScale Blog
MyScale Blog
Microsoft Security Blog
Microsoft Security Blog
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)

博客园 - ProgrammingBookWorm

多层结构来开发ASP.NET程序 在.NET下多层架构企业管理系统的开发 VS2008中文试用版的破解 在ASP.NET 2.0中操作数据::使用ObjectDataSource展现数据 HTTP服务器状态代码定义(Status Code Definitions) CodeSmith快速向导(翻译) 利用.net 2.0中的TreeView控件与数据库绑定,生成无限级的树目录 用户中心 - 博客园 图解Windows2003邮件服务器 Making sense of ASP.Net Paths JScript .NET Fundamentals JScript IntelliSense in Visual Studio Orcas JScript Debugging in Visual Web Developer Orcas javascript中String 对象属性和方法 Window.Open详解 Get Query String variables in JavaScript ASP.NET Script Exploits Overview ASP.NET / How to: Implement Simple Forms Authentication How to: Implement Simple Forms Authentication
用户控件中使用客户端脚本的控件名称问题
ProgrammingBookWorm · 2008-03-13 · via 博客园 - ProgrammingBookWorm

    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" /> 在设计用户控件时,放置了一个TextBox,id为TexBox1,这个用户控件被放置到一 个aspx页面,用户控件的id为WebUserControl11,最后这个用户控件的TextBox到客户端后 就是上面的这个样子的了。 

    客户端提交到服务端时是根据控件的name来提交的,也就是说,对服务端来讲,客户端的 name是有意义的,id是不需要的。 
    在写客户端脚本时你不能预知你的用户控件将会是以什么id加入到aspx页面的,也不能预知 用户控件被嵌套了多少层,所以你根本不能在设计时来参考这些控件。 幸好,asp.net的webcontrol 和 htmlcontrol 的控件有个运行时属性 UniqueID,用来获取服务器 控件的唯一的、以分层形式限定的标识符。对应到上面的那个例子,控件TextBox1的UniqueID就 是“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.net的webcontrol 和 htmlcontrol 的控件还有个运行时属性 ClientID,它用来获取由 ASP.NET 生成的服务器控件标识符,也就是来获取控件的客户端id的,我们再改用这个属性来 试一下: 
    document.all.<%= TextBox1.ClientID %>.value = "kent"; 
    再运行,OK成功,当鼠标移动TextBox时,TextBox中出现了“kent”