分享

ASP.NET数据绑定

 趋明 2012-03-13

  说来也奇怪,最近做了一个Web的项目,需要用到分页,那么数据绑定的学习也变的很重要了,下面结合博客园大牛们的文章来做个总结吧!

  1.数据绑定表达式                          

    ①表达式      

      <%# 数据绑定表达式 %>

    ②在页面编写代码      

                   <%=  C#代码  %>  //调用后台变量或者方法的时候,会用到这种表达式

 

  2.单向绑定                               

    提供一个单向的只读的数据值,只能从数据源中读取数据,不能修改数据源中的数据!

    语法:      

      Eval(“列名|属性名等等”)

    原理:通过反射的机制来实现绑定计算,写“Eval”会在底层调用DataBinder中的静态方法Eval!    

    推荐使用:DataBinder.Eval()用这种方式来绑定数据!          

  

    上面是他的三个重载方法!

    第一个参数始终是   → Container.DataItem

    第二个参数是            → 你要绑定的数据,如列名,属性名等等

    第三个参数是            → 字符串格式化

    如果需要详细了解,请参考:深入ASP.NET数据绑定(上),这是一篇深入理解单向数据绑定的好文!

 

  3.双向绑定                              

    双向绑定:既可以读取数据源的值,又可以修改数据源的值,以便进行数据的更新,主要用于GridView,DataList等支持编辑功能的控件!

    语法:

             Bind(“列名|属性名等等”)

    推荐文章:深入ASP.NET数据绑定(中)——数据双向绑定机理


  4.数据绑定表达式可以是哪些类型呢?                 

    ①可以是个变量      

      例如:<asp:Label ID="Label1" runat="server" Text="<%= 变量名%>"></asp:Label>

        注意如果是变量,变量的反问修饰符不能是私有的,必须要为“public”或“protected”的!

      Note:变量必须使用“=”才能有效果!


    ②可以是服务器控件的属性值

      例如:<asp:Label ID="Label1" runat="server" Text="<%#TextBox2.Text %>"></asp:Label>


    ③可以是一个数组或集合

      这种类型主要针对“DropDownList”,“ListBox”这类的控件!

      有一个数组:  public string[] str = { "22", "333", "4444444", "55555555555" };

        那么你可以在前端进行绑定:<asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# str %>" > </asp:DropDownList>

      Note:你必须要在后台调用控件的“DataBind”方法,不然是没有效果的!


    ④可以是个表达式

      这个说明,你可以使用几种数据并接成你想要的数据!

      如:我们要在一个Label中显示一个用户的全名,那么我们就可以这样写<%#(Person.FirstName+"" + Person.LastName)%>。


    ⑤可以是个方法      

      一开始以为也是使用上面的绑定方法,但是试了好多次都没效果,最后使用了另一种方式 → <% = MyReturn() %>,加了一个等于号,不是使用“#”!


    ⑥DataTable,DataSet等类型      

      Eval和DataBinder.Eval进行数据绑定!

      这样的数据绑定表达式只能用于Repeater,GridView,DataList等等这些控件中!

    推荐文章:浅谈.NET中的数据绑定表达式(一)

 

  5.数据绑定表达式的演变                         

    ①第一种:最常用的

      “Eval”是很多人经常在GridView,Repeater,DataList等控件中使用最多的!


    ②第二种:第一种方法的Father      

      这种写法也比较常见:

          <%# DataBinder.Eval(Container.DataItem,”max_lvl”,”{0:c}” ) %>

      Note:唯一要注意的是参数的选择!

      第一种方法只是把第二种方法进行简化,底层还是会调用第二种方法的!


    ③第三种:性能最好的    

      如果是DataTable或DataSet类型必须要到用命名空间 → <%@ Import namespace="System.Data" %>

      <%# ((DataRowView)Container.DataItem)["age"]%>

          也可以这样写:

            <%#(Container.DataItem as DataRowView)["ProductName"].ToString() %>

        语法:

            ((DataRowView)(Container.DataItem))["列名"]/[列索引]的方式来  

       通用写法:  ((Type)(Container.DataItem)) + 后面是你要获取的值

    演变历程:第三种 → 第二种 → 第一种,所以说现在很多人还在用Eval进行数据绑定,学过数据绑定的人都知道使用第三种方式是最好的!    

    推荐文章:浅谈.NET中的数据绑定表达式(一)

 

  6.查看动态编译页面的程序集,有助于我们深入理解数据绑定底层原理   

    说实话不知道怎么用专业术语来表达,我的理解是这个程序集是基于C#代码和HTML的中间语言!

    动态程序集查看地址:    

      C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 

    找到程序集使用Reflector来查看程序集,如果细致的看下去,我相信你应该有很大的收获的!

    推荐文章::深入ASP.NET数据绑定(上)一步一步的带你熟悉页面编译代码!

 

  7.自定义数据绑定格式                         

    这个想法来源于一个博友的创新idea!参考:教你30秒打造强类型ASP.NET数据绑定

      其中很有dudu大牛的改进版:强类型ASP.NET数据绑定改进版以及增强版:强类型ASP.NET数据绑定改进版之第2版

    自定义代码如下:    

1 public static class DataBindHelper
2 {
3 public static TResult Eval<TEntity, TResult>(this Page page, Func<TEntity, TResult> func)
4 {
5 var item = page.GetDataItem(); //这就是核心代码
6 return func((TEntity)item);

7 }
8 }

    前台调用代码示例:    

1      <asp:Repeater ID="Repeater1" runat="server">
2 <ItemTemplate>
3 <%# DataBindHelper.Eval<People,string>(this,p=>p.Name)%>
4 </ItemTemplate>
5 </asp:Repeater>

    通过自定义的数据绑定格式能更友好的实现数据绑定!

    Note:最好在VS2010上面实验,因为我在2010和2008一样的代码,运行时2008就报错了,“无效的表达式“>”,如果知道的朋友可以告诉我!
    

   8.浅谈数据绑定底层机制                       

    首先要记住在第七点中那句“page.GetDataItem()”代码,这句话可谓说是数据绑定的核心了,它的意识就是 → 获取绑定上下文堆栈顶部的对象!

    有人说理解这个了,数据绑定技术也就是理解80% - 90%了,所以下面我们就重点研究下他!

    说白了就是从堆里面读数据,只是微软封装的太厉害,只看到华丽的外表了!

    推荐文章:深入剖析了各个数据绑定表达式的性能问题 → 浅谈.NET中的数据绑定表达式(二) 


  9.最后来个总结                            

    灵活运行数据绑定技术可以加快开发速度,但千万不要滥用,在合适的场合运行合适的数据绑定,还有选择合适的数据绑定格式也很重要!    

1          <%# DataBindHelper.Eval<People,string>(this,p=>p.Name)%>   //定义数据绑定格式
2 <%# DataBinder.GetDataItem("Name") %>
3 <%# ((People)GetDataItem()).Name %>
4 <%# ((People)Container.DataItem).Name %>
5 <%# Eval("Name") %>
6 <%# DataBinder.Eval(Container.DataItem,"Name","") %>
7 <%# ((System.Data.DataRowView)GetDataItem())[0] %>
8 <%# ((System.Data.DataRowView)Container.DataItem)[0] %>

    其实如果大家认真发现,以及使用Reflector去查看源代码,就会知道“GetDataItem”这个方法其实是最重要的,通过它去获取绑定上下文堆栈顶部的对象,从而实现绑定!


  最后:大家如果跟着本文的步骤去一步步了解大牛们的文章,我相信你对数据绑定一定会有很深入的理解的!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多