温故而知新之Databinder.Eval and Container.DataItem

    在webform开发中,经常会绑定数据到ASPX页面,我们习惯的做法是Databinder.Eval(Container.DataItem,"XX"),我们对绑定有多少了解呢。让我们一起温故数据绑定的知识。

    看下面的简单的webform数据绑定表达式:

代码
 1 <form id="Form1" method="post" runat="server">
 2   <table>         
 3     <asp:Repeater id="Repeater1" runat="server">
 4       <ItemTemplate>
 5         <tr>
 6           <td><%# DataBinder.Eval(Container.DataItem, "Name"%></td>
 7           <td><%# DataBinder.Eval(Container.DataItem, "HexValue"%></td>
 8         </tr>
 9       </ItemTemplate>
10     </asp:Repeater>
11   </table>
12 </form>
13 

结果为

Repeater控件呈现出来的是颜色的名称和相应的16进制表达参数。我们知道绑定到Repeater的数据源可以是DataTable,DataView,SqlDataReader等。Databinder抽象了最基本的数据,我们不用关心实际绑定的类型。

我们可以绑定一个自定义数据集合,例如,用颜色类的ArrayList绑定Repeater,颜色类的代码如下:

代码
 1 public class Color
 2 {
 3    public Color(string name, byte r, byte g, byte b)
 4    {
 5       this.name = name;
 6       hexValue = String.Format(
 7                         "#{0:X2}{1:X2}{2:X2}",
 8                         r, g, b
 9                      );
10    }
11 
12    public string Name
13    {
14       get { return name; }
15    }
16 
17    public string HexValue
18    {
19       get { return hexValue; }
20    }
21 
22    private string name;
23    private string hexValue;
24 }   
25 
26 

我们创建ArrayList,如下:

代码
 1 public static ArrayList GetColors()
 2 {
 3    ArrayList list = new ArrayList();
 4    
 5    list.Add(new Color(System.Drawing.Color.AliceBlue.Name, 
 6                       System.Drawing.Color.AliceBlue.R,
 7                       System.Drawing.Color.AliceBlue.G,
 8                       System.Drawing.Color.AliceBlue.B)
 9             );
10 
11    list.Add(new Color(System.Drawing.Color.Beige.Name,
12                       System.Drawing.Color.Beige.R,
13                       System.Drawing.Color.Beige.G,
14                       System.Drawing.Color.Beige.B)
15             );
16 
17    list.Add(new Color(System.Drawing.Color.Chocolate.Name, 
18                       System.Drawing.Color.Chocolate.R,
19                       System.Drawing.Color.Chocolate.G,
20                       System.Drawing.Color.Chocolate.B)
21       );
22 
23    list.Add(new Color(System.Drawing.Color.DarkMagenta.Name,
24                       System.Drawing.Color.DarkMagenta.R,
25                       System.Drawing.Color.DarkMagenta.G,
26                       System.Drawing.Color.DarkMagenta.B)
27       );
28 
29    list.Add(new Color(System.Drawing.Color.Fuchsia.Name, 
30                       System.Drawing.Color.Fuchsia.R,
31                       System.Drawing.Color.Fuchsia.G,
32                       System.Drawing.Color.Fuchsia.B)
33       );
34 
35    list.Add(new Color(System.Drawing.Color.PapayaWhip.Name,
36                       System.Drawing.Color.PapayaWhip.R,
37                       System.Drawing.Color.PapayaWhip.G,
38                       System.Drawing.Color.PapayaWhip.B)
39       );
40 
41    list.Add(new Color(System.Drawing.Color.Violet.Name, 
42                       System.Drawing.Color.Violet.R,
43                       System.Drawing.Color.Violet.G,
44                       System.Drawing.Color.Violet.B
45                      )
46       );
47 
48    list.Add(new Color(System.Drawing.Color.Black.Name, 
49                       System.Drawing.Color.Black.R,
50                       System.Drawing.Color.Black.G,
51                       System.Drawing.Color.Black.B
52                      )
53         );
54    return list;
55 }
56 
57 

我们用数据绑定设置tr的背景色,如下:

代码
<asp:Repeater id="Repeater1" runat="server">
  
<ItemTemplate>
    
<tr bgcolor="<%# DataBinder.Eval(Container.DataItem, "HexValue")%>">
      
<td><%# DataBinder.Eval(Container.DataItem, "Name"%></td>
      
<td><%# DataBinder.Eval(Container.DataItem, "HexValue"%></td>
    
</tr>
  
</ItemTemplate>
</asp:Repeater>

呈现页面效果为:

为了真正明白在数据绑定表达式背后发生了什么,让我们看看运行时产生的ASPX文件,如下:

代码
public void __DataBind__control3(object sender, System.EventArgs e) {
   System.Web.UI.WebControls.RepeaterItem Container;
   System.Web.UI.DataBoundLiteralControl target;
   target 
= ((System.Web.UI.DataBoundLiteralControl)(sender));
   Container 
= ((System.Web.UI.WebControls.RepeaterItem)(target.BindingContainer));
       
   
#line 17 "E:\dev\xprmnt\aspnet\DataBinding\SimpleData.aspx"
   target.SetDataBoundString(
0
       System.Convert.ToString(DataBinder.Eval(Container.DataItem, 
"HexValue")));
            
   
#line 18 "E:\dev\xprmnt\aspnet\DataBinding\SimpleData.aspx"
   target.SetDataBoundString(
1
       System.Convert.ToString(DataBinder.Eval(Container.DataItem, 
"Name")));
             
   
#line 19 "E:\dev\xprmnt\aspnet\DataBinding\SimpleData.aspx"
   target.SetDataBoundString(
2
       System.Convert.ToString(DataBinder.Eval(Container.DataItem, 
"HexValue")));
       
}

上面的产生的代码来自ASP.NET临时文件夹,代码重要的一点告诉我们在数据绑定时参数转换成Tostring,这意味我们可以用其他表达式代替string,例如,在ItemTemplate中,我们可以:

代码
<asp:Repeater id="Repeater1" runat="server">
  
<ItemTemplate>
    
<tr bgcolor="<%# ((Color)Container.DataItem).HexValue %>">    
      
<td><%# ((Color)Container.DataItem).Name %></td>
      
<td><%# ((Color)Container.DataItem).HexValue %></td>
    
</tr>
  
</ItemTemplate>
</asp:Repeater>

上面的例子使我们跳过DataBind.Eval,直接将DataItem转换成Color类,为在页面上可以用Color类,在页面要Import 命名空间,<%@ Import Namespace="aspnet.DataBinding" %>.

总结:通过文章,告诉大家数据绑定不要limit your self 。

参译:http://odetocode.com/Articles/278.aspx

参考:

What's the deal with Databinder.Eval and Container.DataItem?

http://weblogs.asp.net/rajbk/archive/2004/07/20/what-s-the-deal-with-databinder-eval-and-container-dataitem.aspx

ASP.NET中的Eval()和DataBinder.Eval()方法

http://hi.baidu.com/panjiangchao/blog/item/63a4cb3373a97af21b4cffd9.html

原文地址:https://www.cnblogs.com/kevinlzf/p/1657112.html