zoukankan      html  css  js  c++  java
  • 该不该使用数据源控件——数据源控件与页面生命周期

    微软推荐使用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的话,我们能进行更精确的控制,不是吗?


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

  • 相关阅读:
    vbs习题
    spotlight监控工具使用
    vue 不同路由同一个组件 缓存问题
    iphone手机上3D动画transform:rotateY闪现一下或者不显示
    vue 单独引用sass文件
    cnpm安装 npm安装node-sass报错
    webpack 打包css时提示Unexpected character '@'
    window下npm启动报错This is probably not a problem with npm. There is likely additional logging output above.
    HBuilder 配置android模拟器
    windows 切换git远程仓库地址后 git push 提示Authentication failed
  • 原文地址:https://www.cnblogs.com/freeflying/p/1628028.html
Copyright © 2011-2022 走看看