• 学习之路七:一步一步学习ASP.NET数据绑定


      说来也奇怪,最近做了一个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)) + 后面是你要获取的值  

          Note:Type是你的数据类型,可以是集合,DataTable等等!

        演变历程:第三种 → 第二种 → 第一种,所以说现在很多人还在用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”这个方法其实是最重要的,通过它去获取绑定上下文堆栈顶部的对象,从而实现绑定!


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

  • 相关阅读:
    Windows 批处理(bat)语法大全
    VBS基础篇 wscript 对象
    在Windows上安装和配置Jenkins
    bat批处理中截取字符串
    记事本乱码,如何修复记事本中的中文乱码
    vbs删除文件到回收站,及清空回收站
    在Windows上安装JDK8u321教程
    VBS获取硬盘序列号
    VBS调用Win32 Api函数删除文件
    VBS脚本常用经典代码收集
  • 原文地址:https://www.cnblogs.com/yangcaogui/p/2390065.html
Copyright © 2020-2023  润新知