温故而知新之Databinder.Eval and Container.DataItem
在webform开发中,经常会绑定数据到ASPX页面,我们习惯的做法是Databinder.Eval(Container.DataItem,"XX"),我们对绑定有多少了解呢。让我们一起温故数据绑定的知识。
看下面的简单的webform数据绑定表达式:
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,颜色类的代码如下:
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,如下:
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的背景色,如下:
<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文件,如下:
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中,我们可以:
<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?
ASP.NET中的Eval()和DataBinder.Eval()方法
http://hi.baidu.com/panjiangchao/blog/item/63a4cb3373a97af21b4cffd9.html