天天看點

該不該使用資料源控件——資料源控件與頁面生命周期

微軟推薦使用DataSource控件,并使用DataSourceID指定資料源控件(似乎也未說明理由,至少我沒有看到過)。但很多人并不認同,我一直感覺DataSource控件是一個“黑箱”。

除了ObjectDataSource不夠靈活,使用反射,對性能會有所損耗外,我想它還存在下面的這個問題。

今天我進行了一些測試,并歸納如下,如有缪誤,還望各位指出。

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" />

        <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的話,我們能進行更精确的控制,不是嗎?

(未完,先釋出,待修改)

繼續閱讀