《2022年Eval和Bind的区别 .pdf》由会员分享,可在线阅读,更多相关《2022年Eval和Bind的区别 .pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Eval()和 Bind()这两种一个单向绑定,一个双向绑定bind 是双向绑定,但需数据源可更改才能用ASP.NET 2.0改 善 了 模 板 中 的 数 据 绑 定 操 作,把v1.x中 的 数 据 绑 定 语 法DataBinder.Eval(Container.DataItem,fieldname)简 化 为Eval(fieldname)。Eval方 法 与DataBinder.Eval 一 样 可 以 接 受 一 个 可 选 的 格 式 化 字 符 串 参 数。缩 短 的Eval 语 法 与DataBinder.Eval的不同点在于,Eval会根据最近的容器对象(例如DataList
2、Item)的 DataItem属性来自动地解析字段,而DataBinder.Eval 需要使用参数来指定容器。由于这个原因,Eval只能在数据绑定控件的模板中使用,而不能用于Page(页面)层。当然,ASP.NET 2.0 页面中仍然支持DataBinder.Eval,你可以在不支持简化的Eval语法的环境中使用它。下面的例子演示了如何使用新的简化的Eval 数据绑定语法绑定到DataList 数据项模板(ItemTemplate)中的 Image、Label 和 HyperLink 控件。asp:DataList ID=DataList1 RepeatColumns=5 Width=600
3、runat=server DataSourceID=ObjectDataSource1 ItemTemplate asp:HyperLink ID=HyperLink1 runat=server NavigateUrl='%#Eval(PhotoID,PhotoFormViewPlain.aspx?ID=0)%'asp:Image ID=Image1 Runat=server ImageUrl='%#Eval(FileName,images/thumbs/0)%'/asp:HyperLinkasp:Label ID=CaptionLabel runat=
4、server Text='%#Eval(Caption)%'/ItemTemplate/asp:DataList br/asp:ObjectDataSource ID=ObjectDataSource1 runat=server TypeName=DataComponentTableAdapters.PhotosTableAdapter SelectMethod=GetPhotosForAlbum 数据绑定也可以作为控件的主题定义(theme definition)的一部分,这样我们就可以通过改变主题来随意地改变模板化控件的布局和外观。但是Theme(主题)模板中只能使用E
5、val(或者后面讨论的Bind)。绑定到任意的用户代码是被禁止的。-关注常见绑定格式,不过他们的性能有区别。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 4 页 -(如果属性为字符串类型就不用ToString()了)上面这三个性能最好。/显示二位小数/0:G 代表显示 True 或 False/asp:Image Width=12 Height=12 Border=0 runat=server/AlternateText=/ImageUrl=/转换类型(string)DataBinder.Eval(Container,DataItem.P_SHIP_TIME_SBM8).Sub
6、string(4,4)0:d 日期只显示年月日0:yyyy-mm-dd 按格式显示年月日0:c 货币样式-在本章前面,我们在模板上下文中遇到过 表达式以及Eval方法。Eval方法是一种定制运算符,在数据绑定表达式用来方法所绑定的数据项上的公共属性。前文所用的Eval 方法是一个ASP.NET 2.0才支持的特征,如果在ASP.NET 1.x应用程序中使用,则会产生一个编译错误。对于ASP.NET的所有版本,我们可以使用一个在功能上相当的方法,该方法也称为Eval,但是来自另一个类DataBinder。重要提示:通过 Eval方法(尽管它来自DataBinder 或 Page类),可以访问所绑
7、定的数据项上的公共属性。让我澄清一下公共属性在该上下文中指什么,以及为什么我坚持把它们叫做属性。任何一个实现了IEnumerable 接口的类都可以绑定到一个控件。实际的类列表当然包括DataTable(其中一个数据项在逻辑上对应于表记录),但是它还包括定制集合(其中一个数据项对应于给定类的一个实例。)Eval 方法最终会查询该数据项对象以得到它的属性集。表示一个表记录的对象将返回它的列描述符;其他对象将返回它们的公共属性集。DataBinder 类支持数据绑定表达式的生成和解析。它的静态重载方法Eval特别重要。该方法名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 4 页 -使
8、用反射机制来解析和计算一个运行时对象的表达式。Eval 方法的客户包括RAD 工具,诸如 Microsoft Visual Studio.NET 设计器和Web 控件,它们以声明的方式调用该方法用动态改变的值填充这些属性。1.Eval 方法DataBinder.Eval方法的语法如下:上述代码片断中省略了第3 个可选参数。该参数是一个字符串,包含所绑定值的格式选择。Container.DataItem 表达式引用对该表达式进行计算的对象。该表达式通常是一个字符串,表示数据项对象上要访问的字段的名称。它可以是一个包括索引和属性名的表达式。DataItem 属性表示当前容器上下文中的对象。容器通常
9、即将生成的该数据项对象(例如,DataGridItem 对象)的当前实例。前面所示的代码通常重复出现,而且以相同的形式。只有表达式和格式字符串在页与页之间会有所变化。2.更简洁的 Eval DataBinder.Eval的原始语法在ASP.NET 2.0中可以被简化,这一点我们在前面的Repeater 示例中已经看到。在ASP.NET 2.0中,只要在ASP.NET 1.x中接受如下表达式的地方:就可以使用:不用说,ASP.NET 2.0也是完全支持DataBinder 对象的。在界定符内出现的任何代码,都会得到ASP.NET运行库的特殊处理。让我们简单分析一下该代码会发生什么。编译该页面时,
10、Eval调用作为一个独立的调用插入该页面的源代码中。如下代码说明了会发生什么:object o=Eval(lastname);string result=Convert.ToString(o);该 调 用 的 结 果 被 转 换 为 一 个 字 符 串,并 付 给 一 个 数 据 绑 定 的 文 字 控 件DataBoundLiteralControl 类的一个实例。然而把数据绑定的文字插入该页的控件树中。在 ASP.NET 2.0中,TemplateControl 类(Page的父类)实际上新增了一个名为Eval的受保护的(但不是虚拟的)方法。如下伪代码说明该方法的工作机制:名师资料总结-精
11、品资料欢迎下载-名师精心整理-第 3 页,共 4 页 -protected object Eval(string expression)if(Page=null)throw new I nvalidOperationException();return DataBinder.Eval(Page.GetDataItem(),expression);正 如 我 们 可 以 看 到 的,Eval 是 建 立 在DataBinder.Eval 方 法 之 上 的 一 个 简 单 包 装。DataBinder.Eval方法使用当前容器的数据项调用。非常明显,当前容器的数据在数据绑定操作 之 外为null
12、 即,在 调用DataBind之后 的调 用 栈中。这 一事 实 引起 了Eval 和DataBinder.Eval之间的一个关键区别。重要提示:TemplateControl 的 Eval是一个数据绑定方法,在一个数据绑定操作中只能在一个数据绑定控件的上下文中使用。相反,DataBinder.Eval 是一个完全成熟的方法,可以在程序中的任何地方使用。我们通常在定制的数据绑定控件的实现中使用它。我将在本书的姐妹篇 Programming Microsoft ASP.NET 2.0 Applications:Advanced Topics 中介绍它。3.获得默认的数据项前面给出的说明页面的Ev
13、al方法的行为的伪码,展示了Page类的 GetDataItem 方法。它是什么?如前所述,这一简化语法采用一个默认的Container.DataItem 上下文对象。GetDataItem只不过是返回该对象的函数。更精确地讲,GetDataItem 是跟踪页面的当前绑定上下文的基于栈的机制的终点。该控件树中的每个控件在调用各DataBind 方法时压入该栈中。DataBind 方法返回时,控件从该栈中弹出。如果栈是空的,并且企图以编程的方式调用Eval方法,则 GetDataItem 抛出一个无效的操作异常。总之,我们只能在模板中使用Eval 简化操作;如果需要在代码中的任何其他地方访问一个数据项的属性,则利用DataBinder.Eval方法,并显式地指出数据项对象。提示如前所述,通常只有在定制的数据绑定控件的代码中才需要直接调用DataBinder.Eval方法。(我在 Programming Microsoft ASP.NET 2.0 Applications:Advanced Topics 中介绍了定制控件。)然而,如果发生这种情况,可能需要通过调用DataBinder.GetPropertyValue 方法来保存几个内部调用和CPU周期。最终,这完全是由DataBinder.Eval完成的。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 4 页 -
限制150内