eval()方法
在运行时使用反射执行后期绑定计算因此与标准的ASPNET数据绑定方法bind相比会导致性能明显下降它一般用在绑定时需要格式化字符串的情况下多数情况尽量少用此方法
Eval 方法是静态(只读)方法该方法采用数据字段的值作为参数并将其作为字符串返回Bind 方法支持读/写功能可以检索数据绑定控件的值并将任何更改提交回数据库
使用 Eval 方法
Eval 方法可计算数据绑定控件(如 GridViewDetailsView 和 FormView 控件)的模板中的后期绑定数据表达式在运行时Eval 方法调用 DataBinder 对象的 Eval 方法同时引用命名容器的当前数据项命名容器通常是包含完整记录的数据绑定控件的最小组成部分如 GridView 控件中的一行因此只能对数据绑定控件的模板内的绑定使用 Eval 方法
Eval 方法以数据字段的名称作为参数从数据源的当前记录返回一个包含该字段值的字符串可以提供第二个参数来指定返回字符串的格式该参数为可选参数字符串格式参数使用为 String 类的 Format 方法定义的语法
关于eval()效率
庸置疑的是强类型转换Container的效率是最高的Eval最终是调用DataBinderEval方法DataBinderEval是采用反射来获取数据的这显然不如强类型数据转换
我们可以比较一下各种方法
((Type) ContainerDataItem)Property
这种方法效率是最高的因为不存在任何反射
其次是
((Type) GetDataItem())Property
这种方法效率差的原因在于多了一个Stack的Peek操作当然实际上这点儿差别可以忽略
最后是 Eval或者DataBinderEval这两种方法都使用反射来查找属性或者索引器成员效率大打折扣
另外一个值得注意的问题是所有实现了INamingContainer接口的Control都应该实现IDataItemContainer接口因为在ControlDataBind的时候如果发现控件实现了INamingContainer接口就会试图去寻找它的DataItem如果这个控件没有实现IDataItemContainer则DataBinderGetDataItem方法会使用反射看看控件有没有一个叫做DataItem的属性成员显然这不是我们希望看到的
其实ASPNET还有一个标记接口INonBindingContainer实现了INamingContainer接口的控件可以选择同时实现这个来命令ASPNET不去寻找DataItem可是很可惜不知道微软出于什么目的这个接口是internal的……
其实效率方面不必太重视了Eval表达式很好看的即使有那么极端的重视效率GeDataItem也是不错的选择毋庸置疑的是强类型转换Container的效率是最高的Eval最终是调用DataBinderEval方法DataBinderEval是采用反射来获取数据的这显然不如强类型数据转换
eval()绑定方法
x中的数据绑定语法
代码如下
<asp:Literal id=litEval runat=server Text=<%#DataBinderEval(ContainerDataItem userName)%> />
x简化Eval数据绑定语法
代码如下
<asp:Literal id= runat=server Text=<%Eval(userName)%> />
第二种方法的方法重载
代码如下
<a <%# Eval(userIdDefaultaspx?id={})%>><%# Eval(userName) %></a>
eval同时绑定两个值
代码如下
<a <%# stringFormat(Defaultaspx?id={}&role={} Eval(userId)Eval(userRole))%>><%# Eval(userName) %></a>
Bind()方法
Bind 方法与 Eval 方法有一些相似之处但也存在很大的差异虽然可以像使用 Eval 方法一样使用 Bind 方法来检索数据绑定字段的值但当数据可以被修改时还是要使用 Bind 方法
在 ASPNET 中数据绑定控件(如 GridViewDetailsView 和 FormView 控件)可自动使用数据源控件的更新删除和插入操作例如如果已为数据源控件定义了 SQL SelectInsertDelete 和 Update 语句则通过使用 GridViewDetailsView 或 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=>
<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 语法绑定的每个控件属性值都会被提取出来并传递给数据源控件以执行更新操作
使用 DataBinderEval
ASPNET 提供了一个名为 DataBinderEval 的静态方法该方法计算后期绑定的数据绑定表达式并将结果格式化为字符串(可选)利用此方法可以避免许多在将值强制为所需数据类型时必须执行的显式强制转换操作
例如在下面的代码片段中一个整数显示为货币字符串使用标准的 ASPNET 数据绑定语法必须首先强制转换数据行的类型以便检索数据字段 IntegerValue然后这将作为参数传递到 StringFormat 方法
代码如下
<%# StringFormat({:c} ((DataRowView)ContainerDataItem)[IntegerValue]) %>
将此语法与 DataBinderEval 的语法进行比较后者只有三个参数数据项的命名容器数据字段名称和格式字符串在模板化列表中(如 DataList 类DataGrid 类或 Repeater 类)命名容器始终是 ContainerDataItem
代码如下
<%# DataBindereval_r(ContainerDataItem IntegerValue {:c}) %>
格式字符串参数是可选的如果它被忽略DataBinderEval 将返回类型对象的值如下面的示例所示
代码如下
<%# (bool)DataBindereval_r(ContainerDataItem BoolValue) %>
当对模板化列表中的控件进行数据绑定时DataBinderEval 特别有用因为数据行和数据字段通常都必须强制转换
在TemplateField模板中为了能够有限制的或者取出数据库中某列的值时可以用Bind和Eval方法来实现以下是Bind方法的格式Eval的格式也是和Bind一样的 Bind(列的名称显示的格式文)
比如我们要取个日期型的数据在数据库中列名是updated数值是//但是想年月日这样显示我们可以这样来写Bind(updated {:yyyy年MM月dd日})Eval也是如此
两者都能读取数据中的值并显示当我们使用编辑更新操作时Bind能够自动的将修改的值更新到数据库中并显示出修改后的值但是用了Eval却只能得到错误画面新的数据没有更新到数据库中
从这点看来Bind方法和Eval方法的区别就是Bind方法在读取和更新数据这方面都是可以但是Eval方法只能读取显示数据所以我们在选择Bind方法和Eval方法的时候必须要有争对性当数据肯定需要更新操作的时候我们应该使用Bind只是显示数据不会有任何操作的就可以使用Eval方法
bind()和eval()区别
Eval是只读数据Bind是可更新的
当对次表达式操作时候必须用Eval 如<%# Eval(字段名)ToString()Trim() %>
若GridView中绑定列里面 设置 内容格式 DataFormateString ={:d} 则 必须把 属性 HtmlCode 设置为false否则无法起作用
Eval 单向绑定数据是只读的
Bind 双向绑定数据可以更改并返回服务器端服务器可以处理更改后的数据如存入数据库