经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题。一般有<%= str%>和
<%# str %>两种方式,这里简单总结一下。如有错误或异议之处,敬请各位指教。
一方面,这里所讲的前台即通常的.aspx 文件,后台指的是与 aspx 相关联的 CodeBehind,
文件后缀名为.aspx.cs;另一方面,这里的绑定是指用户发出访问某一页面指令后,服务器端
在执行过程中就已经将前台代码进行了赋值,而后生成 html 格式回传客户端显示,而并非已
经显示到客户端后,然后通过其他方法(如 ajax)去服务器端获取相应变量。
备注:上面说的两个文件是常见的代码隐藏(code-behind)模式,还有一种是代码嵌入(code-
beside, inline)模式,那就是只存在 aspx 一个文件,而后台代码则写入此文件的<script
type="text/javascript" runat="server"></script>之中(还有一些语法上区别),这对
于本文讨论的问题略有影响,因为代码嵌入是声明性代码与 C#/VB.NET 代码都一起编译到一
个类里面,而代码隐藏则将声明性代码与 C#/VB.NET 代码分开几次进行翻译/编译,因此前者
是局部与局部(partial)的关系后者基类与派生类的关系,但这仅仅影响所能绑定变量的范围
(与修饰符有关),下面会提到。以下均以代码隐藏模式为例。
一般来说,在前台代码的三种位置可能会用到(绑定)后台变量:
服务器端控件属性或 HTML 标签属性
JavaScript 代码中
Html 显示内容的位置(也就是开始标签与结束标签
之间的内容,如<div>这里</div>(Html 标签)
或者<asp:Label ID="Label2" runat="server"
Text="Label">这里</asp:Label>(服务器端控
件),它作为占位符把变量显示于符号出现的位
置)
对于第一种位置,有一些约束条件:
(1)一般的属性要求是字符串型或数值型(下面会提到有些服务器端属性支持属性为数据集
合);
(2)并不是所有的属性都可以绑定变量,有些属性例如 runat 属性必须是"server"常量,即
使绑定的字符串是 server,也会导致分析器分析时出错;
(3)有一种属性,他要求属性值有约束(类型约束,比如服务器端控件要求 TabIndex 属性
是 short 类型,或者字符串内容有约束),也应该在绑定时满足,否则依然可能编译时报错;
(4)还一种属性,虽然属性本身有约束,但即使绑定的变量不满足约束,也可以编译通过,
比如 input 的 checked 属性,它只有 checked 字符串是合法的,但如果通过绑定获取到的字
符串不是 checked,那么这些属性将有自己内部处理机制,来保证可以正常使用;
(5)还要注意,即使对于同一类属性,服务器端和 HTML 的属性的处理机制也不同,同样是
TabIndex(tabIndex),前者如果不满足,则分析器错误,后者则忽略这一问题。
对于第二种位置,一般只要绑定的后台变量和 JavaScript 中数据类型兼容即可。
对于第三种位置,如果绑定出现的位置不在服务器端控件内部,则没有约束条件,只要是常量
字符串可以出现的位置,均可以绑定。但是对于置于服务器端控件内部,也就是上面那种