zoukankan      html  css  js  c++  java
  • ASP.NET 数据绑定

    转自:http://www.360doc.com/content/12/0313/09/3767901_193923134.shtml 

     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”这个方法其实是最重要的,通过它去获取绑定上下文堆栈顶部的对象,从而实现绑定!

  • 相关阅读:
    如何:为 Silverlight 客户端生成双工服务
    Microsoft Sync Framework 2.1 软件开发包 (SDK)
    Windows 下的安装phpMoAdmin
    asp.net安全检测工具 Padding Oracle 检测
    HTTP Basic Authentication for RESTFul Service
    Windows系统性能分析
    Windows Server AppFabric Management Pack for Operations Manager 2007
    Mongo Database 性能优化
    服务器未能识别 HTTP 标头 SOAPAction 的值
    TCP WAIT状态及其对繁忙的服务器的影响
  • 原文地址:https://www.cnblogs.com/merray/p/2537654.html
Copyright © 2011-2022 走看看