eval和bind的区别
最近在做asp教程.net的项目,因为涉及到数据库教程项目的绑定,而eval和bind一直老是忘记,现在baidu了下,留个记号:
绑定表达式
<%# eval(“字段名”) %>
<%# bind(“字段名”)%>
最主要的区别:
1、eval取出来的数据时只读的,而bind是可更新的数据。
2、eval通常用来需要对数据进行格式化成字符串,因而和bind方法比,性能会有所下降。
3、在运行时,eval调用databinder对象的eval方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如 gridview 控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用 eval 方法。具体内容可以参考msdn中关于databinder.eval()方法的描述。
通过eval来获取字段的值。如下:
protected void page_load(object sender, eventargs e)
{
list<comment> comments = getcomments();
this.rptcomments.datasource = comments;
this.rptcomments.databind();
}<asp:repeater runat="server" id="rptcomments">
<itemtemplate>
title: <%# eval("title") %>conent: <%# eval("content") %>
</itemtemplate>
<separatortemplate>
<hr />
</separatortemplate>
</asp:repeater>
在这里,eval对象就会通过反射来获取title和content属性的值。于是经常就有人会见到说:“反射,性能多差啊,我可不用!”。在这里我还是对这种追求细枝末节性能的做法持保留态度。当然,在上面的例子里我们的确可以换种写法:
<asp:repeater runat="server" id="rptcomments">
<itemtemplate>
title: <%# (container.dataitem as comment).title %>conent: <%# (container.dataitem as comment).content %>
</itemtemplate>
<separatortemplate>
<hr />
</separatortemplate>
</asp:repeater>
我们通过container.dataitem来获取当前遍历过程中的数据对象,将其转换成comment之后读取它的title和content属性。虽然表达式有些长,但似乎也是个不错的解决方法。性能嘛……肯定是有所提高了。
但是,在实际开发过程中,我们并不一定能够如此轻松的将某个特定类型的数据作为数据源,往往需要组合两种对象进行联合显示。例如,我们在显示评论列表时往往还会要显示发表用户的个人信息。由于c# 3.0中已经支持了匿名对象,所以我们可以这样做:
protected void page_load(object sender, eventargs e)
{
list<comment> comments = getcomments();
list<user> users = getusers();this.rptcomments.datasource = from c in comments
from u in users
where c.userid == u.userid
order by c.createtime
select new
{
title = c.title,
content = c.content,
nickname = u.nickname
};
this.rptcomments.databind();
}
注意:当前容器的数据项:container.dataitem
4、bind()方法的运用,主要应用场景:gridview等可编辑控件的更新操作上。当单击update按钮时,使用 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 方法采用数据字段的名称作为参数,从而与绑定属性关联,如下面的示例所示:
该示例具有一个文本框,用于接受用户输入,这是一个潜在的安全威胁。默认情况下,asp.net 网页验证用户输入是否不包括脚本或 html 元素。有关更多信息,请参见脚本侵入概述。
<edititemtemplate>
<table>
<tr>
<td align=right>
<b>employee id:</b>
</td>
<td>
<%# eval("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 语法绑定的每个控件属性值都会被提取出来,并传递给数据源控件以执行更新操作。