该不该使用数据源控件——数据源控件与页面生命周期

简介: 微软推荐使用DataSource控件,并使用DataSourceID指定数据源控件(似乎也未说明理由,至少我没有看到过)。但很多人并不认同,我一直感觉DataSource控件是一个“黑箱”。除了ObjectDataSource不够灵活,使用反射,对性能会有所损耗外,我想它还存在下面的这个问题。

微软推荐使用DataSource控件,并使用DataSourceID指定数据源控件(似乎也未说明理由,至少我没有看到过)。但很多人并不认同,我一直感觉DataSource控件是一个“黑箱”。

除了ObjectDataSource不够灵活,使用反射,对性能会有所损耗外,我想它还存在下面的这个问题。

 

我以前曾在csdn上问过这个问题:数据源控件读入数据和数据绑定发生在页面事件的哪一个阶段 ,但答案不是很令我满意。

今天我进行了一些测试,并归纳如下,如有缪误,还望各位指出。

 

1、数据源控件的绑定应分“页面初次(Raw)加载” 和“页面回发(postback)”两种情况讨论。

2、在页面初次加载时,数据源绑定应发生在PreRender之后,Render之前。通过设置断点或开启Trace功能可以推断出来。

aspx 代码:

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
< body >
    
< form  id ="form1"  runat ="server" >
    
< div >
        
< asp:DropDownList  ID ="DropDownList1"  runat ="server"
            DataSourceID ="ObjectDataSource1"  DataValueField ="Name" >
        
</ asp:DropDownList >
        
< asp:ObjectDataSource  ID ="ObjectDataSource1"  runat ="server"  TypeName ="LifeCircle.DataManager"  
            SelectMethod ="GetUsers"  DataObjectTypeName ="LifeCircle.User"  
            InsertMethod ="AddUser"   >
        
</ asp:ObjectDataSource >
        
< br  />
        
< asp:Button  runat ="server"  ID ="btn"  Text ="AspButton"  onclick ="btn_Click"   />
        
< br  />
        
< input  type ="submit"  value ="HtmlButton"   /></ div >
    
</ form >
</ body >

aspx.cs 代码:

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
public   partial   class  _Default : System.Web.UI.Page
    {
        
protected   void  Page_PreRender( object  sender, EventArgs e)
        {
        }

        
protected   override   void  Render(HtmlTextWriter writer)
        {
            
base .Render(writer);
        }

        
protected   override   void  LoadControlState( object  savedState)
        {
            
base .LoadControlState(savedState);
        }

        
protected   override   void  LoadViewState( object  savedState)
        {
            
base .LoadViewState(savedState);
        }

        
protected   override   void  RaisePostBackEvent(IPostBackEventHandler sourceControl,  string  eventArgument)
        {
            
base .RaisePostBackEvent(sourceControl, eventArgument);
        }

        
protected   void  Page_Load( object  sender, EventArgs e)
        {
            
if  (IsPostBack)
            {
               
            }
        }

        
protected   void  btn_Click( object  sender, EventArgs e)
        {
            DataManager.AddUser();
            
this .DropDownList1.DataBind();
        }
    }

模拟数据代码:

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
public   class  DataManager    
    {
        
static  List < User >  users  =   new  List < User > {
                
new  User{ID = 1 ,Name = " tanye " },
                
new  User{ID = 2 ,Name = " chenjuan " }
            };                

        
public   static  List < User >  GetUsers()
        {
            
return  users;             
        }

        
public   static   void  AddUser()
        {
            users.Add( new  User { ID  =   3 , Name  =   " tanchao "  });
        }

       
    }


3、问题的重点在于当页面被PostBack时。我们难免产生这些疑问:

  3.1  页面还会再次从数据源中读取数据么?

  3.2  应该不会!不然就太傻了。测试的结果也的确如此。那DropDownList1的状态时如何得以维护的呢?

  3.3  肯定是通过ViewState,我想。如何证明呢?可以禁掉ViewState试试看!

  3.4  果然,当ViewState=“false”之后,程序就不得不又运行到GetUsers()方法,来获取数据。(注意:和页面初次加载取值不同,这一次获取数据发生在Init之后,Load之前)

但这究竟是如何实现的呢?ASP.NET是在何时进行ViewState的判断,并进入不同的分支的呢?事实上,我不知道。。。我仅仅知道以下几个方法:

· LoadViewState()   //获取ViewState

· ProcessPostData()  //对ViewState进行处理

· GetView()  //ObjectDataSource的方法

还望高手指点!

 

4、然后,如果我们在btn_Click()方法,再加上修改数据源的代码,这必然进行再一次的绑定!似乎在性能上有稍许损耗,如果不使用DataSourceID,而直接使用DataSource的话,我们能进行更精确的控制,不是吗?


(未完,先发布,待修改)

 

 

 

相关文章
|
9月前
|
安全 测试技术 程序员
软工总结——生命周期各阶段所需文档
软工总结——生命周期各阶段所需文档
|
前端开发
前端工作总结244-修改其他页面的时间逻辑
前端工作总结244-修改其他页面的时间逻辑
63 0
|
前端开发
前端工作总结101-根据页面的内容调用
前端工作总结101-根据页面的内容调用
79 0
|
前端开发
前端工作总结265-跨组件传值
前端工作总结265-跨组件传值
43 0
|
前端开发
好客租房60-组件的生命周期三个阶段-2更新时
好客租房60-组件的生命周期三个阶段-2更新时
94 0
好客租房60-组件的生命周期三个阶段-2更新时
好客租房61-组件的生命周期三个阶段-3更新时
好客租房61-组件的生命周期三个阶段-3更新时
88 0
好客租房61-组件的生命周期三个阶段-3更新时
好客租房59-组件的生命周期三个阶段-1创建时
好客租房59-组件的生命周期三个阶段-1创建时
86 0
好客租房59-组件的生命周期三个阶段-1创建时
好客租房63-组件的生命周期三个阶段-5不常用钩子函数介绍
好客租房63-组件的生命周期三个阶段-5不常用钩子函数介绍
73 0
好客租房63-组件的生命周期三个阶段-5不常用钩子函数介绍
好客租房62-组件的生命周期三个阶段-4卸载时
好客租房62-组件的生命周期三个阶段-4卸载时
93 0
好客租房62-组件的生命周期三个阶段-4卸载时
|
JavaScript
好客租房139-长列表性能优化(懒渲染)
好客租房139-长列表性能优化(懒渲染)
142 0