开发者社区> 17bang自由飞> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

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

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

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

 

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

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

 

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

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

aspx 代码:

代码
<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 代码:

代码
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();
        }
    }

模拟数据代码:

代码
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的话,我们能进行更精确的控制,不是吗?


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

 

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
前端工作总结106-小程序学习2开始布局页面2
前端工作总结106-小程序学习2开始布局页面2
0 0
前端工作总结105-小程序学习1开始布局页面
前端工作总结105-小程序学习1开始布局页面
0 0
好客租房60-组件的生命周期三个阶段-2更新时
好客租房60-组件的生命周期三个阶段-2更新时
0 0
好客租房61-组件的生命周期三个阶段-3更新时
好客租房61-组件的生命周期三个阶段-3更新时
0 0
好客租房59-组件的生命周期三个阶段-1创建时
好客租房59-组件的生命周期三个阶段-1创建时
0 0
好客租房63-组件的生命周期三个阶段-5不常用钩子函数介绍
好客租房63-组件的生命周期三个阶段-5不常用钩子函数介绍
0 0
好客租房62-组件的生命周期三个阶段-4卸载时
好客租房62-组件的生命周期三个阶段-4卸载时
0 0
温故而知新之:生命周期
vue的生命周期还是比较饶腾的,最直接的方法就是都写出来体验一下。
0 0
这一次,不再为web页面生命周期烦恼
这一次,不再为web页面生命周期烦恼
0 0
乱想-生命周期
时间紧张了,在博客中看看,找自己喜欢的答案,时间充足了,自己去钻研钻研,去找自己的答案,这也许已经成为我的习惯,喜欢讲别人的东西用自己的话再次加工,取其精华变为己有。 春秋冬来,四季轮回,我们无法控制,但是我们去可以在其四个阶段中的一个阶段中做一些自己可以做的事情。
795 0
+关注
17bang自由飞
据说是最懂法律的包工头,最会码字的程序猿&hellip;&hellip;
文章
问答
文章排行榜
最热
最新
相关电子书
更多
动态、高效,蚂蚁动态卡片的内核逻辑
立即下载
用RxSwift写易维护易读的愉悦代码
立即下载
基于密码技术的 云数据全生命周期保护
立即下载