Eval方法和Bind方法有何区别
【考点】
Eval方法和Bind方法的理解。
【出现频率】
★★★★☆
【解答】
数据绑定表达式可用Eval方法和Bind方法将数据绑定到数据控件,而非所有控件。Eval方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。Bind方法支持读写功能,可以将查询数据绑定为控件属性的值并将任何更改提交回数据库。
【分析】
本题主要考查面试者对数据绑定语法的熟悉程度。Eval方法可用于绑定数据字段到数据控件,这是ASP.NET 2.0新添加的方法,在一定范围内和DataBind.Eval方法等价,Eval方法的使用如以下代码所示。
<%# Eval("字段名") %>
或
<%# Eval("字段名","{0:c}") %>
最后一个参数和String类的Format方法形式一样,即c代表货币、p代表百分号、d代表短日期格式显示、f代表浮点数、f3代表小数点后三位等。
说明:Eval方法根据最近的容器对象的DataItem属性自动解析字段,而DataBinder.Eval方法接受该容器的一个参数。因此,Eval方法仅在数据绑定控件的模板中使用,而不能在页面级别使用,不过Eval方法更加简便,而DataBinder.Eval方法可用于Eval方法不受支持的场合。
Bind方法与Eval方法有相似之处,同时也存在比较大的差异。可以将Bind方法来查询数据绑定字段的值,方法和Eval一样,但是当数据可以被修改时(如数据控件的编辑状态),必须用Bind方法才能将修改提交到数据库。Bind方法通常与输入控件一起使用,例如使用GridView控件时,由编辑模式中的行所呈现的TextBox控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入控件中用户的输入值,其使用方法如以下代码所示。
<%# Bind("字段名") %>
在实际开发中,Bind方法绑定的性能比Eval方法高。不过Eval更加灵活,因为可以更方便地显示各种格式的字符串。在仅仅需要显示控件属性所绑定的数据时,Eval是最常用的选择,假设在数据控件的子项模板(如Repeater控件的ItemTemplate)绑定数据字段,其方法如以下代码所示。
<ItemTemplate>
<tr>
<td>
<asp:Label runat="server" Text=<%# Eval("UserName") %>>
</asp:Label>
</td>
<td>
<asp:Label runat="server"
Text=<%# ((DataRowView)Container.DataItem)["Message"] %>>
</asp:Label>
</td>
</tr>
</ItemTemplate>
以上代码中,绑定“UserName”字段时使用了Eval,而绑定“Message”字段时使用ASP.NET1.1的数据绑定方法,这种方法采用DataRowView强制类型转换并提取其指定字段,其性能同样大大高于Eval方法。当程序需要双向绑定时,如数据控件的编辑项模板(如GridView控件的EditItemTemplate)中使用Bind方法绑定数据字段。具体做法为,编程者在这个模板中放入输入控件(如TextBox、CheckBox或DropDownList),然后将相应的属性通过Bind方法绑定到数据源的字段,即完成了双向绑定,可允许数据控件从模板的输入控件中提取值并传递给数据源。编辑项模板的部分如以下代码所示。
<EditItemTemplate>
ID:
<asp:Label id="ItemLabel"
Text='<%# Bind("id") %>'
runat="server"/>
<br />
用户名:
<asp:Label id="ItemLabel"
Text='<%# Bind("UserName") %>'
runat="server"/>
<br />
留言内容:
<asp:TextBox id="QtyTextBox"
Text='<%# Bind("Message") %>'
runat="server"/>
</EditItemTemplate>
注意:属性使用Bind方法绑定数据的控件(如TextBox)必须手动设置ID属性。
由此可知,EditItemTemplate(编辑项模板)或InsertItemTemplate(插入项模板)中常使用Bind方法的双向绑定数据,并允许GridView或DetailsView数据控件从这些模板的控件中提取值。