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


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

  • 相关阅读:
    怎么查看京东店铺的品牌ID
    PPT编辑的时候很卡,放映的时候不卡,咋回事?
    codevs 1702素数判定2
    codevs 2530大质数
    codevs 1488GangGang的烦恼
    codevs 2851 菜菜买气球
    hdu 5653 Bomber Man wants to bomb an Array
    poj 3661 Running
    poj 1651 Multiplication Puzzle
    hdu 2476 String Painter
  • 原文地址:https://www.cnblogs.com/freeflying/p/1628028.html
Copyright © 2011-2022 走看看