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

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
IT之家
IT之家
V
V2EX
Jina AI
Jina AI
V
Visual Studio Blog
有赞技术团队
有赞技术团队
博客园 - 司徒正美
博客园 - 叶小钗
The Cloudflare Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
Google Online Security Blog
Google Online Security Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
N
News and Events Feed by Topic
N
News and Events Feed by Topic
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
月光博客
月光博客
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
SecWiki News
SecWiki News
博客园_首页
罗磊的独立博客
量子位
Latest news
Latest news
I
Intezer
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Last Week in AI
Last Week in AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
SegmentFault 最新的问题
S
Security Affairs
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
News | PayPal Newsroom

博客园 - Ferry

ASP.NET网站权限设计实现(三)——套用JQuery EasyUI列表显示数据、分页、查询 ASP.NET网站权限设计实现(二)——角色权限绑定 ASP.NET读取网络图片并在页面上显示 ASP.NET网站权限设计实现(一)——使用PowerDesigner进行数据库设计 Visual Studio 2010 架构图之用例图(UML Use Case Diagram) ASP.NET MVC3 新的视图引擎(View Engine) 一个德国人图解中西文化差异(值得一看) 微软AJAX CDN(内容分发网络) 注册使用GAC—Global Assembly Cache(.NET) ASP.NET 递归将分类绑定到 TreeView - Ferry 新浪微博PC客户端(DotNet WinForm版)——功能实现分解介绍 新浪微博PC客户端(DotNet WinForm版)—— 初探 C#:30行数据插入到数据库中的效率测试-一行行执行、构造SQL一次执行、SqlBulkCopy C#使用GMAIL群发带附件邮件的例子 ASP.NET Web 应用开发实战快速上手系列 3—C#面向对象编程纲要-类 ASP.NET带进度条多文件上传 在高优先级下运行应用程序 学习使用NHibernate2.1.0Beta1(续七)— 单例模式 ASP.NET Web 应用开发实战快速上手系列 2——C#基础
ASP.NET4.0中客户端ID的生成
Ferry · 2010-10-21 · via 博客园 - Ferry

       从去年某个时候,我开始探索ASP.NET4.0 Web窗体的改进。我发现ASP.NET4.0中一些令人兴奋地改进,我确认这一切都会使WEB开发更简单并为我们提供更多灵活性。因此我逐个摘选了这些 很令人兴奋地ASP.NET4.0特性。早些时候,我写得对于URL路由的文章,你可以通过点击下面链接查看。
       ASP.NET 4.0中的URL路由

       如标题所述,你知道这儿我要讨论,我们如何控制ASP.NET 4.0中ASP.NET服务器控件客户端ID的生成。早些时候,这个客户端ID对我来说是另外一件神秘的事情,但是后来我发现了.NET引擎生成服务器端控件ID的算法。

       环境:
       Visual Studio 2010

       为什么是客户端ID:
       客户端ID经常是个问题,特别是现在,新时代的应用程序中,我们更偏向于丰富互联网应用程序的客户端编程。在过去的几年里,已经形成像JQuery、JSON、DOJO等创建比较丰富的UI的许多技术和编程方法。

       在DOM中,要访问的控件的客户端ID扮演者重要的角色。因此微软也通过提供能够确保更简单和更少错误的RIA开发的控制客户端ID生成的功能,试图让我们的编程生活更简单。

       之前版本的客户端ID:
       让我讨论一下,早期版本中客户端ID是如何生成的。

       首先,我从标准控件TextBox或Label开始说起。这儿生成的客户端ID,前缀以 用下划线分割的 自上而下的所有的命名容器为前缀。这确实是一个在客户端生成唯一ID的好主意。但是正如我讨论的,客户端ID是新时期应用程序开发的重要组成部分。看一下 一个简单的TextBox服务器控件的例子:
Brij_634099931410072031_normal35aspx.jpg

       从上面的图片我们可以看到,我的Label和TextBox是在一个contentplaceholder里面,接着看一下客户端ID:
Brij_634099931410863047_normalpage3.5.jpg

       现在这儿的客户端ID是ctl00_ContentPlaceHolder1_myTextBox。如果我们从ctl00开始一个一个的数(以下划线为分隔符),下一个是contentplaceholder的ID,再下一个是TextBox的ID。

       值得注意的一点是,当你移动控件到其它位置时,客户端ID会自动改变。

       虽然我们知道页面会生成唯一的ID,但是你必须不让任何控件超出页面的控制范围。.NET引擎会根据她的算法为你自动生成客户端ID。

       现在,让我们来谈谈一些数据控件,如GridView、ListView、DropDownList等。用这些控件做什么?我们只给控件绑定数据源。在运 行时,基于此数据,控件行被自动生成。关于这儿的客户端ID呢?客户端ID如我们已经讨论的方法一样,自动生成,并且前缀带有行号。看一看这个示例。

       我的aspx中的GridView代码。这儿我显示了ID、BookName和Price。
Brij_634099944294876719_dataaspx35.jpg

       上面例子中,我使用了一个GridView。在GridView中的不同模板列中有三个Label。GridView在contentplaceholder中。看一下客户端ID:
Brij_634099931409554453_datapage35.jpg

       你可以看到像ctl00_ContentPlaceHolder1_gridviewBooks_ctl02_lblID这样的ID,由.NET引擎按序列生成前缀,后面加Label的ID。

       这种ID非常不易用。

       随着新时期WEB开发的发展,在WEB开发中,当你在客户端做大量工作的时候,客户端ID成为重要组成部分。

       ASP.NET 4.0中控件的客户端ID的生成
       ASP.NET 4.0中提供了有效地方法控制客户端ID的生成。ASP.NET 4.0中提供一个新的属性ClientIDMode用于处理控件客户端ID的生成,这个属性使得我们可以自定义如何生成控件的客户端 ID,ClientIDMode提供四个选项:
       * AutoID
       * Static
       * Predictable
       * Inherit

       我们一个一个的来讨论。

       AutoID:这个属性的功能和之前.NET版本生成客户端ID的功能相同。如果你不想改变之前版本的客户端ID生成的功能,就指定这个值。

       Static:意味着你想控件有一个静态的ID。当你知道控件的ID在页面中唯一的时候,你应该改使用这个选项。.NET引擎会生成相同的客户端ID而不会添加任何后缀或前缀。这种模式主要用于标准的单个控件。看一下例子.

Brij_634099931410443125_normalaspx4.jpg

       在上图中你看到,我设置Label的ClientIDMode为AutoID,设置TextBox的为Static。现在让我们看一下生成的客户端ID.
Brij_634099931624398203_normalpage4.jpg

       你看到Label的客户端ID和之前版本相同是因为我设置ClientIDMode的值为Auto.

       但对于TextBox,我设置为Static,所以其客户端ID跟我们在aspx页面中设置的一样。这就是ASP.NET4.0之美。如果我们设置为Static,.NET引擎直接使用控件的ID作为客户端ID,而不会生成新的客户端ID。

       Note:有一点需要注意,如果我们设置的模式是Static而页面中确没有相同客户端ID的控件,是因为页面中有相同客户端ID的控件。这可能是灾难性的,当我们从客户端访问的时候。

       Predictable:这是另外一个我喜欢的客户端ID生成模式。当你确实不能确定ID在页面中是否唯一的时候,那么你可以用这个选项。这个值允许我们预测呈现页面中的客户端ID。当你设置为此选项时,你需要根据你自己的选择设置更多的属性。

       我把上面的例子的aspx代码修改如下:
Brij_6340999314098181251_gridviewaspx4.jpg

       由于我们用了数据控件,这样的话,我们不能设置选项为Static,因为基于此数据将生成多个控件(每行数据一个)。

       我们使用模式Predictable以便我们可以预测控件的ID将会是什么。我们需要多设置一个ClientIDRowSuffix属性,我设置其值为ID列的值。

       看看得到的客户端ID
Brij_634099931409232188_datapage4.jpg

       我们看控件的客户端ID是MainContent_gridviewBooks_lblName_1。如果看得更深入一点,我们发现根本没有计数器这回 事。第一个是contentplaceholder的ID,接下来是GridView的ID,再下来是Label的ID,后缀ID是我们设置的。

       Inherit: 控件ID的生成将和父控件相同。这个是控件的默认选项。

       设置各级属性

       有很多地方我们可以设置ClientIDMode属性。可以是控件级别或页面级别或应用程序级别。结果是一样的。我们可以像下面那样设置页面指令:
Brij_634099931624788828_Pagelevel.jpg

       要设置应用程序级的,需要在配置文件中设置,设置将被应用到应用程序中的所有页面:
Brij_634099931408040781_Applevel.jpg

翻译辛苦,转载请注明出处。