asp.net bind()和eval()的区别

eval()方法
在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法
Eval 方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。Bind 方法支持读/写功能,可以检索数据绑定控件的值并将任何更改提交回数据库。
使用 Eval 方法
Eval 方法可计算数据绑定控件(如 GridView、DetailsView 和 FormView 控件)的模板中的后期绑定数据表达式。在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如 GridView 控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用 Eval 方法。
Eval 方法以数据字段的名称作为参数,从数据源的当前记录返回一个包含该字段值的字符串。可以提供第二个参数来指定返回字符串的格式,该参数为可选参数。字符串格式参数使用为 String 类的 Format 方法定义的语法。

关于eval()效率

庸置疑的是强类型转换Container的效率是最高的,Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,这显然不如强类型数据转换。

我们可以比较一下各种方法:   
    
((Type)   Container.DataItem).Property  
 
     这种方法效率是最高的,因为不存在任何反射。   
    
     其次是:   
 
((Type)   GetDataItem()).Property  
 
     这种方法效率差的原因在于多了一个Stack的Peek操作,当然,实际上这点儿差别可以忽略。   
    
     最后是:    Eval或者DataBinder.Eval,这两种方法都使用反射来查找属性或者索引器成员,效率大打折扣。   
    
     另外一个值得注意的问题是,所有实现了INamingContainer接口的Control,都应该实现IDataItemContainer接口,因为在Control.DataBind的时候,如果发现控件实现了INamingContainer接口,就会试图去寻找它的DataItem,如果这个控件没有实现IDataItemContainer,则DataBinder.GetDataItem方法会使用反射看看控件有没有一个叫做DataItem的属性成员,显然这不是我们希望看到的。

其实ASP.NET还有一个标记接口:INonBindingContainer,实现了INamingContainer接口的控件可以选择同时实现这个来命令ASP.NET不去寻找DataItem,可是很可惜,不知道微软出于什么目的,这个接口是internal的……   
    
     其实效率方面不必太重视了,Eval表达式很好看的,即使有那么极端的重视效率,GeDataItem也是不错的选择。毋庸置疑的是强类型转换Container的效率是最高的,Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,这显然不如强类型数据转换。

eval()绑定方法

1、1.x中的数据绑定语法

代码如下 复制代码 
<asp:Literal id="litEval2" runat="server" Text=‘<%#DataBinder.Eval(Container.DataItem, "userName")%>‘ />

2、 2.x简化Eval数据绑定语法

代码如下 复制代码 
<asp:Literal id="http://www.hzhuti.com/nokia/5900xm/" runat="server" Text=‘<%Eval("userName")%>‘ />

3、第二种方法的方法重载

代码如下 复制代码 
<a href=‘<%# Eval("userId","Default.aspx?id={0}")%>‘><%# Eval("userName") %></a>

4、eval同时绑定两个值

代码如下 复制代码 
<a href=‘<%# string.Format("Default.aspx?id={0}&role={1}", Eval("userId"),Eval("userRole"))%>‘><%# Eval("userName") %></a>

Bind()方法

Bind 方法与 Eval 方法有一些相似之处,但也存在很大的差异。虽然可以像使用 Eval 方法一样使用 Bind 方法来检索数据绑定字段的值,但当数据可以被修改时,还是要使用 Bind 方法。

在 ASP.NET 中,数据绑定控件(如 GridView、DetailsView 和 FormView 控件)可自动使用数据源控件的更新、删除和插入操作。例如,如果已为数据源控件定义了 SQL Select、Insert、Delete 和 Update 语句,则通过使用 GridView、DetailsView 或 FormView 控件模板中的 Bind 方法,就可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。出于这个原因,在数据绑定控件的 EditItemTemplate 或 InsertItemTemplate 中要使用 Bind 函数。

Bind 方法通常与输入控件一起使用,例如由编辑模式中的 GridView 行所呈现的 TextBox 控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。

Bind 方法采用数据字段的名称作为参数,从而与绑定属性关联,如下面的示例所示

Bind 方法通常与输入控件一起使用,例如由编辑模式中的 GridView 行所呈现的 TextBox 控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。

Bind 方法采用数据字段的名称作为参数,从而与绑定属性关联,如下面的示例所示:

代码如下 复制代码 
<EditItemTemplate> 
<table> 
<tr> 
<td align=right> 
<b>Employee ID:</b> 
</td> 
<td> 
<%# eval_r("EmployeeID") %> 
</td> 
</tr> 
<tr> 
<td align=right> 
<b>First Name:</b> 
</td> 
<td> 
<asp:TextBox ID="EditFirstNameTextBox" RunAt="Server" 
Text=‘<%# Bind("FirstName") %>‘ /> 
</td> 
</tr> 
<tr> 
<td align=right> 
<b>Last Name:</b> 
</td> 
<td> 
<asp:TextBox ID="EditLastNameTextBox" RunAt="Server" 
Text=‘<%# Bind("LastName") %>‘ /> 
</td> 
</tr> 
<tr> 
<td colspan="2"> 
<asp:LinkButton ID="UpdateButton" RunAt="server" 
Text="Update" CommandName="Update" />

<asp:LinkButton ID="CancelUpdateButton" RunAt="server" 
Text="Cancel" CommandName="Cancel" /> 
</td> 
</tr> 
</table> 
</EditItemTemplate>

单击行的 Update 按钮时,使用 Bind 语法绑定的每个控件属性值都会被提取出来,并传递给数据源控件以执行更新操作。

使用 DataBinder.Eval
ASP.NET 提供了一个名为 DataBinder.Eval 的静态方法,该方法计算后期绑定的数据绑定表达式,并将结果格式化为字符串(可选)。利用此方法,可以避免许多在将值强制为所需数据类型时必须执行的显式强制转换操作。

例如,在下面的代码片段中,一个整数显示为货币字符串。使用标准的 ASP.NET 数据绑定语法,必须首先强制转换数据行的类型以便检索数据字段 IntegerValue。然后,这将作为参数传递到 String.Format 方法:

代码如下 复制代码 
<%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %>

将此语法与 DataBinder.Eval 的语法进行比较,后者只有三个参数:数据项的命名容器、数据字段名称和格式字符串。在模板化列表中(如 DataList 类、DataGrid 类或 Repeater 类),命名容器始终是 Container.DataItem。

代码如下 复制代码 
<%# DataBinder.eval_r(Container.DataItem, "IntegerValue", "{0:c}") %>

格式字符串参数是可选的。如果它被忽略,DataBinder.Eval 将返回类型对象的值,如下面的示例所示:

代码如下 复制代码 
<%# (bool)DataBinder.eval_r(Container.DataItem, "BoolValue") %>

当对模板化列表中的控件进行数据绑定时,DataBinder.Eval 特别有用,因为数据行和数据字段通常都必须强制转换。

在TemplateField模板中为了能够有限制的或者取出数据库中某列的值时,可以用Bind和Eval方法来实现。以下是Bind方法的格式,Eval的格式也是和Bind一样的。 Bind("列的名称","显示的格式文")

比如我们要取个日期型的数据,在数据库中列名是updated,数值是2008/06/01。但是想2008年06月01日这样显示,我们可以这样来写Bind("updated", "{0:yyyy年MM月dd日}"),Eval也是如此。

两者都能读取数据中的值,并显示。当我们使用编辑更新操作时,Bind能够自动的将修改的值更新到数据库中,并显示出修改后的值。但是用了Eval却只能得到错误画面,新的数据没有更新到数据库中。

从这点看来,Bind方法和Eval方法的区别就是:Bind方法在读取和更新数据这2方面都是可以,但是Eval方法只能读取显示数据。所以,我们在选择Bind方法和Eval方法的时候,必须要有争对性,当数据肯定需要更新操作的时候我们应该使用Bind,只是显示数据,不会有任何操作的就可以使用Eval方法。

bind()和eval()区别 
1、Eval是只读数据,Bind是可更新的.
2、当对次表达式操作时候,必须用Eval 如<%# Eval("字段名").ToString().Trim() %>
3、若GridView中绑定列里面 设置 内容格式 DataFormateString ={0:d} ,则 必须把 属性 HtmlCode 设置为false,否则无法起作用;
Eval 单向绑定:数据是只读的
Bind 双向绑定:数据可以更改,并返回服务器端,服务器可以处理更改后的数据,如存入数据库

时间: 2024-11-09 10:36:28

asp.net bind()和eval()的区别的相关文章

Bind和Eval的区别详解

原文:Bind和Eval的区别详解 1.简单描述Eval和Bind的区别 绑定表达式 <%# Eval("字段名") %> <%# Bind("字段名") %> 区别 1.eval是只读数据,bind是可更新的. 2.当对次表达式操作时候,必须用Eval 如<%# Eval("字段名").ToString().Trim() %> 2.若GridView中绑定列里面 设置 内容格式 DataFormateStri

Asp.net中DataBinder.Eval用法的总结

<%# Bind("Subject") %> //绑定字段<%# Container.DataItemIndex + 1%> //实现自动编号<%# DataBinder.Eval(Container.DataItem, "[n]") %>通常使用的方法(这三个性能最好)<%# DataBinder.Eval(Container.DataItem, "ColumnName") %><%# Da

jQuery中的bind() live() delegate()之间区别分析

jQuery中的bind() live() delegate()之间区别分析 首先,你得要了解我们的事件冒泡(事件传播)的概念,我先看一张图 1.bind方式 $('a').bind('click',function (){ alert('click'); }) 解析:这种方式最简单,jq扫描文档找出所有的a,让将函数绑定到每个元素的click事件上 2.live方式 $('a').live('click',function (){ alert('click'); }) 解析:jq将函数绑定到$

Jquery绑定事件(bind和live的区别)

Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function(){}); (3)target.live("click",function(){}); 第一种方法很好理解,其实就和普通JS的用法差不多,只是少了一个on而已 第二.三种方法都是绑定事件,但是二者又有很大的不同,下面着重讲解一下,因为这个如果用到Jquery的框架的话是用的挺多的,尤其要

Jquery中bind和live的区别

Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function(){}); (3)target.live("click",function(){}); 第一种方法很好理解,其实就和普通JS的用法差不多,只是少了一个on而已 第二.三种方法都是绑定事件,但是二者又有很大的不同,下面着重讲解一下,因为这个如果用到Jquery的框架的话是用的挺多的,尤其要

bind 和 live的区别

Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function(){}); (3)target.live("click",function(){}); 第一种方法很好理解,其实就和普通JS的用法差不多,只是少了一个on而已 第二.三种方法都是绑定事件,但是二者又有很大的不同,下面着重讲解一下,因为这个如果用到Jquery的框架的话是用的挺多的,尤其要

新建网站与新建Asp.Net Web 应用程序的区别

.net网站和应用程序区别,网站是动态执行的不用编译,他只依赖于自己的文档本身,甚至你用aspx里直接写jsp代码都可以,其实网站可以说只是在.net平台中打开的文档,相当于最初的记事本编码,他并不需要依赖于.net才能执行(当然如果你引用.net自带的类库或工具就需要了),但是项目就需要依赖于.net平台了. 今天新建网站的时候,发现,原来新建网站有两种方法. 1.原来一直用的是直接新建---网站 然后添加后解决方案的项目名称是路径的名称 2.还有一种是新建--项目,然后选web--新建asp

call,apply,bind的用法以及区别

1.call.apply.bind的作用是改变函数运行时this的指向 方法调用模式: 当一个函数被保存为对象的一个方法时,如果调用表达式包含一个提取属性的动作,那么它就是被当做一个方法来调用,此时的this被绑定到这个对象. var a = 1 var obj1 = { a:2, fn:function(){ console.log(this.a) } } obj1.fn()//2 此时的this是指obj1这个对象,obj1.fn()实际上是obj1.fn.call(obj1),事实上谁调用

bind与call的区别

bind与call很相似,,例如,可接受的参数都分为两部分,且第一个参数都是作为执行时函数上下文中的this的对象. 不同点有两个: ①bind的返回值是函数 //都是将obj作为上下文的this function func(name,id) {     console.log(name,id,this); } var obj = "Look here"; //什么也不加 func("    ","-->"); //使用bind是 返回改变