zoukankan      html  css  js  c++  java
  • 温故而知新之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

  • 相关阅读:
    团体程序设计天梯赛PTA L1-006连续因子
    团体程序设计天梯赛PTA L1-002打印沙漏
    spring学习3-配置文件
    markdown基本用法
    java贪食蛇小游戏
    在idea中使用lombook插件
    ajax初体验hello_ajax
    idea,自定义骨架的增加与删除
    idea 2017,2018,2019下载与破解
    idea关联mysql数据库失败,时区错误,数据库驱动配置
  • 原文地址:https://www.cnblogs.com/kevinlzf/p/1657112.html
Copyright © 2011-2022 走看看