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

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

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

 

ExpandedBlockStart.gif 代码
 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,颜色类的代码如下:

 

ExpandedBlockStart.gif 代码
 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,如下:

 

ExpandedBlockStart.gif 代码
 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的背景色,如下:

 

ExpandedBlockStart.gif 代码
< 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文件,如下:

 

ExpandedBlockStart.gif 代码
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中,我们可以:

 

ExpandedBlockStart.gif 代码
< 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/archive/2010/01/26/1657112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值