薛堪豪的个人博客分享 http://blog.sciencenet.cn/u/bfax 兴趣:凝聚态物理,电化学

博文

ASP.NET 4.0 版本一个务实的改进

已有 3234 次阅读 2014-2-20 04:51 |个人分类:计算机|系统分类:科研笔记

ASP.NET 2.0 版本开始支持母版(MasterPage),这个对网站全站设计带来很大方便,也是顺理成章的一个新功能。


然而使用 MasterPage 有一点让人不爽:文本框等表单控件的 id 和 name 属性在前台 HTML 中会被 ASP.NET 加上很多“垃圾内容”。比如最简单的一个例子-要求输入用户名的文本框


<asp:TextBox ID="user" runat="server" />


然而在前台,你会发现这个文本框的 id 被改成:


<input name="ctl00$body\$user" type="text" id="body_user" />


无论是 name 属性还是 id 属性都面目全非了。其中  ct100 是一个固定不变的“累赘”,而“body”则是我在母版页面设置的相应 ContentPlaceHolder 的 ID 值。


这意味着前台 JavaScript 中无论使用“表单名.文本框名”的方式还是使用一般的“document.getElementById”方式,都无法访问这个文本框。


在 ASP.NET 4.0 之前的版本,解决方法可以想到两种,但都不够好。第一种是在 JavaScript 编程的时候人为加上“body_”的前缀。然而,假如控件很多的话,一一增加这些前缀工作量会比较大。并且,这些前缀都会传输到客户端,增加了带宽消耗。另一种是采用 <%= %> 的方法从前台获得真实 ClientID。这种方式将导致部分回归 ASP 3 的意大利面条式的编程风格,将静态部分和动态部分杂糅在一起,是我无法忍受的。两种方法比起来,宁愿选择前一种。


微软这样做也有它自己的道理,是为了防止命名冲突,但“强行”修改程序员写的控件ID,并且居然不提供一种方法在后台确定性地指定前台 id,势必导致 <%= %> 的大行其道。这无疑损害了 ASP.NET 一贯的优雅风格。微软是要逼大家一律在后台编程,禁止前台自己写 JavaScript 吗?这是不现实的,因为 ASP.NET 毕竟不可能代办前台的一切。


解决这个问题也很简单,只要提供一种可以在后台指定前台 id 的语法就可以了。终于在 ASP.NET 4.0 中见到了,就是设定 ClientIDMode="Static",如下


<asp:TextBox ID="user" runat="server" ClientIDMode="Static" />


这样,前台这个文本框的 name 虽然还是乱七八糟,但起码 id 成为了指定的 “user"。这就可以在前台 JavaScript 中使用 document.getElementById() 来访问它了。



https://blog.sciencenet.cn/blog-365047-769045.html

上一篇:Zotero 自定义文献格式
下一篇:三线共点, 线面夹角公式
收藏 IP: 93.5.178.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-25 17:45

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部