`
sailorlee
  • 浏览: 42722 次
  • 性别: Icon_minigender_1
  • 来自: 河北唐山
最近访客 更多访客>>
社区版块
存档分类
最新评论

揭秘ASP.NET 2.0的Eval方法

阅读更多
 

实际上Eval方法是TemplateControl的,而System.Web.UI.Page和System.Web.UI.UserControl都继承于TemplateControl,所以我们可以在Page和UserControl上直接调用个方法。  
   
  Page.Eval方法可以帮助我们更好的撰写数据绑定表达式,在ASP.NET   1.x时代,数据绑定表达式的一般形式是:  
  <%#   DataBinder.Eval(   Container   ,   “DataItem.Name”)   %>  
  而在ASP.NET   2.0中,同样的代码,我们可以这样写:  
  <%#   Eval(   “Name”   )%>  
  ASP.NET   2.0是怎么实现的呢?我们先从Eval方法来研究,通过反射.NET   Framework   2.0类库的源代码,我们可以看到这个方法是这样实现的:  
  protected   internal   object   Eval(string   expression)  
  {  
              this.CheckPageExists();  
              return   DataBinder.Eval(this.Page.GetDataItem(),   expression);  
  }  
  第一行我们不必管,这是检查调用的时候有没有Page对象的,如果没有则会抛出一个异常。  
  关键是第二行:  
              return   DataBinder.Eval(this.Page.GetDataItem(),   expression);  
  Page.GetDataItem()也是2.0中新增的一个方法,用途是正是取代ASP.NET   1.x中的Container.DataItem。  
  看来不摸清楚GetDataItem()方法,我们也很难明白Eval的原理。GetDataItem的实现也很简单:  
  public   object   GetDataItem()  
  {  
              if   ((this._dataBindingContext   ==   null)   ||   (this._dataBindingContext.Count   ==   0))  
              {  
                          throw   new   InvalidOperationException(SR.GetString("Page_MissingDataBindingContext"));  
              }  
              return   this._dataBindingContext.Peek();  
  }  
  我们注意到了有一个内部对象_dataBindingContext,通过查源代码发现这是一个Stack类型的东西。所以他有Peek方法。而这一段代码很容易看懂,先判断这个Stack是否被实例化,然后,判断这个Stack里面是不是有任何元素,如果Stack没有被实例化或者没有元素则抛出一个异常。最后是将这个堆栈顶部的元素返回。  
  ASP.NET   2.0用了一个Stack来保存所谓的DataItem,我们很快就查到了为这个堆栈压元素和弹出元素的方法:Control.DataBind方法:  
  protected   virtual   void   DataBind(bool   raiseOnDataBinding)  
  {  
              bool   flag1   =   false;//这个标志的用处在上下文中很容易推出来,如果有DataItem压栈,则在后面出栈。  
              if   (this.IsBindingContainer)//判断控件是不是数据绑定容器,实际上就是判断控件类是不是实现了INamingContainer  
              {  
                          bool   flag2;  
                          object   obj1   =   DataBinder.GetDataItem(this,   out   flag2);//这个方法是判断控件是不是有DataItem属性,并把它取出来。  
                          if   (flag2   &&   (this.Page   !=   null))//如果控件有DataItem  
                          {  
                                      this.Page.PushDataBindingContext(obj1);//把DataItem压栈,PushDataBindingContext就是调用_dataBindingContext的Push方法  
                                      flag1   =   true;  
                          }  
              }  
              try  
              {  
                          if   (raiseOnDataBinding)//这里是判断是不是触发DataBinding事件的。  
                          {  
                                      this.OnDataBinding(EventArgs.Empty);  
                          }  
                          this.DataBindChildren();//对子控件进行数据绑定,如果这个控件有DataItem,则上面会将DataItem压入栈顶,这样,在子控件里面调用Eval或者GetDataItem方法,就会把刚刚压进去的DataItem给取出来。  
              }  
              finally  
              {  
                          if   (flag1)//如果刚才有压栈,则现在弹出来。  
                          {  
                                      this.Page.PopDataBindingContext();//PopDataBindingContext就是调用_dataBindingContext的Pop方法  
                          }  
              }  
  }  
  至此,我们已经可以完全了解ASP.NET   2.0中GetDataIten和Eval方法运作的原理了,下一次我打算研究ASP.NET   2.0中的新的Bind语法。  

 

有提供Bind语法资料的和提出好建议的酌情给分,up、顶等分会很少,接分者无分。

     关于效率:

     毋庸置疑的是强类型转换Container的效率是最高的,Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,这显然不如强类型数据转换。  

     我们可以比较一下各种方法:  

 

((Type)   Container.DataItem).Property  


     这种方法效率是最高的,因为不存在任何反射。  

   
     其次是:   
((Type)   GetDataItem()).Property 

     这种方法效率差的原因在于多了一个Stack的Peek操作,当然,实际上这点儿差别可以忽略。  

     最后是:    Eval或者DataBinder.Eval,这两种方法都使用反射来查找属性或者索引器成员,效率大打折扣。  
   
     另外一个值得注意的问题是,所有实现了INamingContainer接口的Control,都应该实现IDataItemContainer接口,因为在Control.DataBind的时候,如果发现控件实现了INamingContainer接口,就会试图去寻找它的DataItem,如果这个控件没有实现IDataItemContainer,则DataBinder.GetDataItem方法会使用反射看看控件有没有一个叫做DataItem的属性成员,显然这不是我们希望看到的。  

 

     其实ASP.NET还有一个标记接口:INonBindingContainer,实现了INamingContainer接口的控件可以选择同时实现这个来命令ASP.NET不去寻找DataItem,可是很可惜,不知道微软出于什么目的,这个接口是internal的……     

    其实效率方面不必太重视了,Eval表达式很好看的,即使有那么极端的重视效率,GeDataItem也是不错的选择。毋庸置疑的是强类型转换Container的效率是最高的,Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,这显然不如强类型数据转换。  
 

see   http://localhost/QuickStartv20/aspnet/doc/data/templates.aspx#twowaybind  
  双向数据绑定  
  与   DetailsView   控件一样,FormView   通过其关联的数据源控件支持自动   Update、Insert   和   Delete   操作。若要定义编辑或插入操作的输入   UI,可在定义   ItemTemplate   的同时定义   EditItemTemplate   或   InsertItemTemplate。在本模板中,您将对输入控件(如   TextBox、CheckBox   或   DropDownList)进行数据绑定,以绑定到数据源的字段。但是,这些模板中的数据绑定使用“双向”数据绑定语法,从而允许   FormView   从模板中提取输入控件的值,以便传递到数据源。这些数据绑定使用新的   Bind(fieldname)   语法而不是   Eval。    
   
  重要事项:   使用   Bind   语法进行数据绑定的控件必须设置有   ID   属性。    
   
  <asp:FormView   DataSourceID="ObjectDataSource1"   DataKeyNames="PhotoID"   runat="server">  
      <EditItemTemplate>  
          <asp:TextBox   ID="CaptionTextBox"   Text='<%#   Bind("Caption")   %>'   runat="server"/>  
          <asp:Button   Text="Update"   CommandName="Update"   runat="server"/>  
          <asp:Button   Text="Cancel"   CommandName="Cancel"   runat="server"/>  
      </EditItemTemplate>  
      <ItemTemplate>  
          <asp:Label   Text='<%#   Eval("Caption")   %>'   runat="server"   />  
          <asp:Button   Text="Edit"   CommandName="Edit"   runat="server"/>  
      </ItemTemplate>  
  </asp:FormView>  
  在对   GridView   或   DetailsView   执行更新或插入操作时,如果该控件的列或字段定义了   BoundField,GridView   或   DetailsView   负责创建   Edit   或   Insert   模式中的输入   UI,以便它能自动提取这些输入值以传递回数据源。由于模板包含任意的用户定义的   UI   控件,因此,需要使用双向数据绑定语法,这样   FormView   等模板化控件才能知道应从模板中提取哪些控件值以用于更新、插入或删除操作。在   EditItemTemplate   中仍然可以使用   Eval   语法进行不传递回数据源的数据绑定。另请注意,FormView   与   DetailsView   和   GridView   一样,支持使用   DataKeyNames   属性保留主键字段(即使这些字段并未呈现)的原始值以传递回更新/插入操作。    
   
  FormView   支持使用   DefaultMode   属性指定要显示的默认模板,但在默认情况下,FormView   以   ReadOnly   模式启动并呈现   ItemTemplate。若要启用用于从   ReadOnly   模式转换为   Edit   或   Insert   模式的   UI,可以向模板添加一个   Button   控件,并将其   CommandName   属性设置为   Edit   或   New。可以在   EditItemTemplate   内添加   CommandName   设置为   Update   或   Cancel   的按钮,以用于提交或中止更新操作。类似地,也可以添加   CommandName   设置为   Insert   或   Cancel   的按钮,以用于提交或中止插入操作。    
   
  下面的示例演示一个定义了   ItemTemplate   和   EditItemTemplate   的   FormView。ItemTemplate   包含使用   Eval(单向)绑定的控件,而   EditItemTemplate   包含一个使用   Bind   语句双向绑定的   TextBox   控件。主键字段   (PhotoID)   是使用   DataKeyNames   属性在视图状态中进行往返的。FormView   包含用于在其模板之间进行切换的命令按钮。    
   
   
  C#   Two-Way   Databinding   in   a   FormView   Edit   Template  
       
   
  通过使用添加到   Columns   或   Fields   集合的   TemplateField,GridView   和   DetailsView   还支持模板化   UI。TemplateField   支持使用   ItemTemplate、EditItemTemplate   和   InsertItemTemplate(仅   DetailsView)指定这些控件的不同呈现模式中的字段   UI。与上面的   FormView   示例一样,EditItemTemplate   或   InsertItemTemplate   中的双向绑定允许   GridView   或   DetailsView   从这些模板中的控件提取值。TemplateField   的常见用途是向   EditItemTemplate   添加验证程序控件,用于   GridView   或   DetailsView   操作的声明性验证。下面的示例演示这种方法的一个示例。有关   ASP.NET   中可用的验证控件的更多信息,请参考本教程的“验证窗体输入控件”部分。    
   
   
  C#   Validation   in   a   GridView   Edit   Template  
       
   
  TemplateField   的另一个用途是自定义输入控件,这种控件用于输入   GridView   或   DetailsView   列/字段值。例如,可以将   DropDownList   控件放在   TemplateField   的   EditItemTemplate   中,以允许从预定义的值列表进行选择。下面的示例演示这种方法。注意,本例中的   DropDownList   与它自己的数据源控件进行了数据绑定,以便动态地获取该列表的值。    
   
   
  C#   DropDownList   in   a   GridView   Edit   Template  

ASP.NET   2.0   改进了模板中的数据绑定,将数据绑定语法由完整的   v1.x   语法   DataBinder.Eval(Container.DataItem,   fieldname)   简化为   Eval(fieldname)。与   DataBinder.Eval   一样,Eval   方法也接受一个可选的   formatString   参数。缩写的   Eval   语法与   DataBinder.Eval   的不同之处,在于   Eval   根据最近的容器对象(在上面的示例中为   DataListItem)的   DataItem   属性自动解析字段,而   DataBinder.Eval   接受该容器的一个参数。因此,Eval   仅在数据绑定控件的模板中使用,而不能在“页”级别使用。当然,ASP.NET   2.0   页继续支持   DataBinder.Eval,因此它可用于简化的   Eval   语法不受支持的场合。   <asp:DataList   DataSourceID="ObjectDataSource1"   runat="server">  
      <ItemTemplate>  
          <asp:Image   ImageUrl='<%#   Eval("FileName",   "images/thumbs/{0}")   %>'   runat="server"/>  
          <asp:Label   Text='<%#   Eval("Caption")   %>'   runat="server"/>  
      </ItemTemplate>  
  </asp:DataList>

分享到:
评论

相关推荐

    揭秘ASP.NET 2.0的Eval方法.doc

    ### 揭秘ASP.NET 2.0的Eval方法 #### 一、Eval方法概述 在ASP.NET 2.0中,Eval方法是一个重要的特性,它简化了数据绑定的语法,使得开发者能够更加灵活地处理数据绑定操作。Eval方法最初定义在`TemplateControl`类...

    ASP.NET 2.0快速入门(2):ASP.NET 2.0 数据绑定

    ASP.NET 2.0是微软开发的一个用于构建Web应用程序的框架,它极大地简化了Web开发过程,特别是对于数据驱动的应用程序。在这个快速入门教程中,我们将深入探讨ASP.NET 2.0的数据绑定机制,这是创建动态网页的关键部分...

    ASP.NET 2.0快速入门(7):ASP.NET 2.0 数据绑定的基本技巧

    ASP.NET 2.0支持一种特殊的语法,称为数据绑定表达式,如`&lt;%# Eval("FieldName") %&gt;`,它可以用来从数据源中获取值并显示在页面上。 7. **数据操作** GridView不仅支持显示数据,还允许用户编辑、插入和删除数据...

    超酷的Asp.net2.0留言板.zip

    这个"超酷的Asp.net2.0留言板"可能是基于该版本的ASP.NET技术实现的一个示例应用,旨在展示如何在网站上创建交互式的用户交流平台。下面,我们将深入探讨Asp.NET 2.0的一些核心特性及其在留言板应用中的应用。 1. *...

    ASP.NET 2.0入门与提高系列课程(4):ASP.NET 2.0数据绑定

    ASP.NET 2.0是微软推出的Web应用程序开发框架,它极大地简化了Web应用的构建过程。本系列课程的第四部分重点讲解ASP.NET 2.0中的数据绑定技术,这是一个核心概念,对于创建动态、交互式的网页至关重要。数据绑定允许...

    ASP.NET 2.0快速入门(9):ASP.NET 2.0 数据绑定高级技巧

    ASP.NET 2.0 是微软推出的Web应用程序开发框架,它为开发者提供了强大的工具和功能,使得构建动态网站、Web应用程序和服务变得更加便捷。本教程重点聚焦于ASP.NET 2.0中的数据绑定高级技巧,这对于创建数据驱动的...

    微软asp.net2.0快速入门第二节

    ASP.NET 2.0是微软开发的一个用于构建Web应用程序的框架,它是在ASP.NET 1.x的基础上进行了一系列改进和增强的版本。本节主要聚焦于ASP.NET 2.0的数据绑定,这是构建动态网站和Web应用程序的核心技术之一,用于将...

    ASP.NET 2.0 数据绑定

    ### ASP.NET 2.0 数据绑定 #### 一、ASP.NET 2.0简介 ASP.NET 2.0是微软发布的一个用于构建动态Web应用程序的框架。它建立在.NET Framework之上,提供了许多新功能和改进,使开发人员能够更轻松地创建高性能、可...

    ASP.NET+2.0+数据绑定高级技巧 pdf

    - **ASP.NET 2.0中的简化表达式**:在新版框架中,我们可以直接使用`Eval`函数,这使得代码更加简洁明了。 ```html &lt;%# Eval("Price") %&gt; ``` - **XML数据绑定**:新增的XML数据绑定功能允许开发者直接使用...

    Web应用开发ASP.NET2.0课后习题答案

    ASP.NET 2.0是微软推出的用于构建动态网站、web应用程序和web服务的框架,它在.NET Framework 2.0的基础上提供了丰富的功能和改进。在《Web应用开发ASP.NET 2.0》这门课程中,学生将学习如何利用这个强大的工具来...

    ASP.NET 2.0 入门与提高 陈锐老师课程系列四

    【ASP.NET 2.0 入门与提高】 ASP.NET 2.0是微软开发的一款用于构建Web应用程序的框架,它是.NET Framework的一部分。这个框架在2005年发布,相较于1.1版本,带来了许多增强和新特性,旨在简化开发过程并提高效率。...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    ASP.NET 2.0+SQL Server 2005全程指南 目录 基础篇 第1章 ASP.NET概述及环境配置 1.1 认识ASRNET 1.1.1 .NET Framework框架 1.1.2 ASP.NET功能与特性 1.1.3 ASP.NET与ASP的区别 1.2 搭建ASP.NET开发环境 1.2.1...

    ASP.NET 2.0与数据库连接范例

    ASP.NET 2.0是微软开发的一个用于构建动态网站、Web应用程序和服务的框架。它提供了丰富的功能和工具,使得开发者可以高效地创建交互式的、数据驱动的网页。在这个"ASP.NET 2.0与数据库连接范例"中,我们将探讨如何...

    在ASP.NET 2.0中实现数据的绑定

    ASP.NET 2.0是微软开发的一个Web应用程序框架,它为开发者带来了许多增强的功能和改进,尤其是在数据绑定方面。在ASP.NET 2.0中,数据绑定成为了一种更为强大和灵活的技术,允许开发者更轻松地处理数据源,提供排序...

    asp.net2.0常用代码及常用函数

    这个"asp.net2.0常用代码及常用函数"的资源包显然包含了开发者在实践中经常使用的代码片段和函数集,对于理解和提升ASP.NET 2.0编程技能大有裨益。 1. **页面生命周期与事件处理** ASP.NET 2.0中的页面生命周期...

    ASP.NET2.0(C#)基础教程 李勇平老师的ppt课件 char2

    综上所述,ASP.NET 2.0基础教程主要讲解了如何使用C#开发ASP.NET Web应用程序,包括页面结构、代码编写方式、运行时行为和数据交互方法。学习这些内容对于理解ASP.NET应用程序的工作原理以及开发动态web应用至关重要...

Global site tag (gtag.js) - Google Analytics