快速业务通道

深入ASP.NET数据绑定(下)——多样的绑定方式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
绑定字段值。所以我们是可以绑定跨级的间接属性和关联DataRowRelation行的值。

还想在再来说说其它的绑定方式,李涛在它的博客浅谈.NET中的数据绑定表达式(二)中提到了绑定数 据的七种方式,分别为:

<%#Container.DataItem%>
<%#GetDataItem()%>
<%#Eval("字段名")% >
<%#DataBinder.Eval(Container.DataItem,"字段名")%>
<%#((DataRowView) Container.DataItem)["字段名"] %>
<%#((Type)Container.DataItem).成员 %>
<% #((Type)GetDataItem()).成员 %>

如果按要我来分的话,我只会分成两类:强类型绑定和反射绑定。不论是Container.DataItem还是 GetDataItem(),都是得到当前的正在绑定的上下文数据对象,然后转换成他们的原始类型,使用索引或 强类型的方式来绑定字段值。而Eval就是使用反射的方式来进行通用化的绑定,这样我们就完全没有必要 关心被绑定的数据源是什么类型,在很多场合下这是非常有益的。

从性能方式来考虑,强类型绑定肯定要比反射绑定性能来得好。这其中的原因就不多作解释了,但是 对于强类型来说是使用Container.DataItem还是GetDataItem的方式来取得上下文数据对象,性能应该差 别不大的。我们在前面已经提到到,在Page的作用域内,会把所有的被绑定(遍历的数据项或整个集合) 保存在一个堆栈,方面我们来读取,我们只需要读取堆栈的顶部元素就可以方便的得到当前正在被绑定数 据行项;而Container而更像是一个动态的,关键字作用的变量,因为你在绑定不同对象时Container的类 型是不一样的,假设你当前正在绑定Repeater那么它的类型是RepeaterItem,只是为了方便我们强类型取 得当前Repeater行对象而产生的动态属性,其实它并不是Page的一个公有或私有属性。所以我认为两种取 得DataItem的方式在性能上实际是没有多大区别的。

当然我们在选择是使用强类型绑定还是反射绑定时,主要还是取决你的需要。我个人认为,为了使用 解决方案通用化,而不必在关心绑定的数据类型是什么类型,应尽量使用Eval的方式来绑定字段。在实践 当中,绑定字段的消费上还不是非常多的,为了灵活和通用这点性能损失我认为是值得的。另外就是如上 的特殊字段的情况,我当然也可以使用强类型绑定的方式来解决:

<%#((System.Data.DataRowView)Container.DataItem)["电压(a)"]%>

特殊字段的解决之道有很多,比如我们还可以重写Page的Eval方法达到我们的目的。选择哪种方案, 就是取决于我们实际需要了。

上面我们从特殊字段名出发,分析了DataBinder在反射取得字段值时所做的一些特殊处理,进而引出 我们平常可能会被忽略的一些非常有用的绑定方式,如:索引下标绑定和间接字段绑定,而这些对于我们 解决一些疑难问题会有很大的帮助,特别跨级的字段绑定,如果我们没有了解的话,可能就需要在服务器 代码中做很多的类型转换和处理。最后我们还讨论了其它的几种绑定方式,以及它们各种的性能和应用场 合。

三天,用篇文章来分析了ASP.NET在数据绑定的一个原理,其中很多内容并不是我们平常数据绑定时所 需要掌握的知识。但是掌握了它们却对我们在数据绑定时,有更多的把握。正因为内容的动态性,和过于 抽象,而本人又无法找到一种最为合适的语言来组织和解释这些知识,代码太多,全部贴出来又感觉找不 到重点;贴重要的部分,又感觉跨度太大。所以三篇下来很多要领解释的不是很清楚,大家权当它是一个 引子,更多的原理还需要大家自己亲自去分析和阅读代码。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号