||
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() 来访问它了。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-25 17:45
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社