【www.gdgbn.com--php与数据库】

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 comments = getcomments();
    this.rptcomments.datasource = comments;
    this.rptcomments.databind();
}


   
        title: <%# eval("title") %>

        conent: <%# eval("content") %>
   
   
       



   


  在这里,eval对象就会通过反射来获取title和content属性的值。于是经常就有人会见到说:“反射,性能多差啊,我可不用!”。在这里我还是对这种追求细枝末节性能的做法持保留态度。当然,在上面的例子里我们的确可以换种写法:


   
        title: <%# (container.dataitem as comment).title %>

        conent: <%# (container.dataitem as comment).content %>
   
   
       



   

  我们通过container.dataitem来获取当前遍历过程中的数据对象,将其转换成comment之后读取它的title和content属性。虽然表达式有些长,但似乎也是个不错的解决方法。性能嘛……肯定是有所提高了。

  但是,在实际开发过程中,我们并不一定能够如此轻松的将某个特定类型的数据作为数据源,往往需要组合两种对象进行联合显示。例如,我们在显示评论列表时往往还会要显示发表用户的个人信息。由于c# 3.0中已经支持了匿名对象,所以我们可以这样做:

protected void page_load(object sender, eventargs e)
{
    list comments = getcomments();
    list 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 元素。有关更多信息,请参见脚本侵入概述。

 


 
   
     
        employee id:
     
     
        <%# eval("employeeid") %>
     
   
   
     
        first name:
     
     
                  text="<%# bind("firstname") %>" />
     
   
   
     
        last name:
     
     
                    text="<%# bind("lastname") %>"  />
     
   
   
     
                  text="update" commandname="update" />
         
                  text="cancel" commandname="cancel" />
     
   
 

 

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

 

本文来源:http://www.gdgbn.com/jiaocheng/29046/