葛 世 强
(兰州职业技术学院 信息工程系,兰州 730070)
在.NET编程中经常会碰到在前台代码中要使用或绑定后台代码中变量值的问题。一般有<%= str%>和<%# str %>两种方式。前台即通常的.aspx文件,后台指的是与aspx相关联的CodeBehind,文件后缀名为.aspx.cs。一般来说,在前台代码的三种位置可能会绑定后台变量:
(1)服务器端控件属性或HTML标签属性;
(2)JavaScript代码中;
(3)Html显示内容的位置。
服务器端控件属性或HTML标签属性中绑定后台变量需要注意:
(1)要绑定的控件或标签一般的属性要求是字符串型或数值型;
(2)并不是所有的属性都可以绑定变量,有些属性例如runat属性必须是“server”常量,即使绑定的字符串是server,也会导致分析器分析时出错;
(3)某些属性要求属性值有约束(类型约束,比如服务器端控件要求TabIndex属性是short类型,或者字符串内容有约束),也应该在绑定时满足,否则依然可能编译时报错;
(4)虽然属性本身有约束,但即使绑定的变量不满足约束,也可以编译通过,比如input的checked属性,它只有checked字符串是合法的,但如果通过绑定获取到的字符串不是checked,那么这些属性将有自己内部处理机制,来保证可以正常使用;
(5)即使对于同一类属性,服务器端和HTML的属性的处理机制也不同,同样是TabIndex(tabIndex),前者如果不满足,则分析器错误,后者则忽略这一问题。
JavaScript代码中绑定后台变量只要注意绑定的后台变量和JavaScript中数据类型兼容即可。
如果绑定出现的位置不在服务器端控件内部,则没有约束条件,只要是常量字符串可以出现的位置,均可以绑定。但是对于置于服务器端控件内部,则有约束条件。此类控件可以归纳为四类服务器端控件,如果绑定的代码出现在这些控件的开始和结束标签之间则有不同的显示结果。
这类控件要求它的开始标签和结束标签中只能包含指定的子控件,因此如果在这里出现代码块,将编译错误。例如:
该类控件不允许在内部嵌套其他控件或标签,只能是常量字符串,它会将开始标签和结束标签中常量字符串内容作为它的属性。例如TextBox就会将标签间内容作为它的Text属性值。
这类控件可以嵌套其他任意控件,也可以包含字符串,因此可以正常显示绑定代码块所表示的字符串内容。例如Label控件、Panel控件等。
此类控件是ASP.NET提供的服务器端控件,除了可以绑定普通的变量类型,也可以绑定一个数据集合。
后台变量是泛指的:成员变量、方法或属性的返回值、表达式和数据集合。后台变量需要满足两个方面的要求:
变量是静态或者实例字段均可。对于代码隐藏模式的ASP.NET,以上所述的变量必须为public或protected类型(因为是基类与派生类的关系),private或者internal都不行,而代码嵌入模式则任何修饰符的变量均可访问(一个类内部的关系)。
由于前台属性一般是字符串类型,而JavaScript基本类型也就是字符串型、数字型、布尔型,因此对应的变量应该也是这几种方式,其余类型如果不被支持(如复杂类型、数组、引用类型等),前台获取的就是调用了变量的ToString()方法所得到的字符串。因此,在绑定时,要根据情况看是否能进行隐式类型转换,必要时还要用相关函数来强制转换,以保证前台可以获得正确的值。当然,对于数据绑定类控件,它的有些属性可以为数据集合,但这时的绑定只能通过特定的方式才被支持。
此种方式在ASP中就开始使用了。ASP通过包含在< % 和 %>中的表达式将执行结果输出到客户浏览器,如:< % =now() %>就是将当前时间的值发送到客户浏览器中。在ASP.NET中,这个表达式依然可以使用,并可以应用于前台代码的服务器端控件属性或HTML标签属性、JavaScript代码中、Html显示内容的位置三种情况,但是要注意,除了上述的一般性约束外,对于控件属性,还必须是绑定到非服务器端控件的属性。另外,它只能绑定上面讲的成员变量、方法或属性的返回值和表达式这三种变量类型,不支持绑定数据集合。
该方式是在.aspx页中使用数据绑定的基础,所有数据绑定表达式都必须包含在这些字符中。
(1)从可以使用的范围来看,除了能出现在服务器端控件属性或HTML标签属性、JavaScript代码中、Html显示内容外,还可以出现在服务器端控件的属性中。
(2)从绑定的变量类型上看,还可以配合ASP.NET的数据绑定类控件,来绑定数据集合。如:ArrayList(数组),Hashtable(哈稀表,DataView(数据视图)),DataReader等。
(3)从用法上看,在前台代码中除了在相应位置写上<%# %>外,在后台代码中,还需要调用DataBind方法。只有执行了相应控件的DataBind方法,前台代码中这些控件中使用<%# %>的绑定才会发生,否则的话将不会被赋值,而是默认空值。
两种绑定方式上约束基本相同,都要求与属性匹配即可将数据显示在预期显示的位置。<%# …… %>的使用位置更广泛,尤其是支持服务器端控件和绑定数据集合。后台代码方面,<%# …… %>需要调用DataBind才能完成绑定,<%= ……%>则没有这方面要求。
两者在执行机制上的区别:<%= ……%>是在程序执行时调用(应该是在页面的RenderControl事件过程中完成的,也就是通常情况下我们可以看到的后台代码都执行完毕后再去到前台代码中进行赋值绑定);而<%# ……%>是在DataBind()方法之后被调用,一旦调用了DataBind(),则它对应的控件将绑定变量。
参考文献:
[1]邵珠贵,杨惠英.关于ASP.NET网页间数据共享的研究[J].吉林广播电视大学学报,2012,(1).
[2]刘伟,蔡晋强.基于ASP.NET数据绑定控件的应用[J].电脑开发与应用,2010,(9).
[3]陈志坚.ASP.NET数据绑定技术的分析与研究[J].福建电脑,2010,(7).
[4]刘永艳,刘敦敏.浅谈ASP.NET数据的绑定[J].电脑编程技巧与维护,2009,(10).