Asp.net控制項開發學習筆記(六)—-資料回傳

來源:互聯網
上載者:User
Asp.net控制項開發學習筆記(六)----資料回傳

   在Asp.net中,利用Http Post的回傳機制意味著可以再用戶端儲存狀態並且可以在伺服器接收.Asp.net中大部分控制項都提供了儲存自身狀態的功能並且在自身狀態改變時引發對應事件。IPostDataHandler介面提供了在伺服器處理用戶端通過Http Post回傳資料的方法。

 

IPostDataHandler

通過實現IPostDataHandler介面,伺服器可以在不使用Page和Request對象的情況下來讀取用戶端回傳資料。IPostDataHandler還提供了在使用者狀態改變的情況下來引發相應事件的架構。IPostDataHandler的定義如下:

    public interface IPostBackDataHandler

    {

        public bool LoadPostData(string postDataKey,

        NameValueCollection postCollection);

        public void RaisePostDataChangedEvent();

}

 

對於LoadPostData函數,如果傳回值為true,則會引發下面的RaisePostDataChangeEvent方法。這個方法中我們可以加入需要引發的事件,比如:

public virtual void RaisePostDataChangeEvent()

    {

        OnTextChanged(EventArgs.Empty);

}

這個方法有兩個參數,先說第二個參數,第二個參數返回索引值對,key(鍵)是控制項的unique id,這個id是通過用戶端的id來決定的,大多數情況下,這兩個id相等,比如用戶端的<input id=”xx” runat=”server” />則在服務端的unique id也會是”xx”,但是如果控制項放在gridview或者masterpage裡的話,uniqueid會是母控制項的uniqueid+分隔字元+子控制項的uniqueid.而value(值)則是對應控制項的回傳資料。比如:


   
在頁面只有兩個控制項,TextBox控制項和Button控制項,前兩個是asp.net內建的ViewState和驗證。而第三個是id名為”cc”的TextBox,第四個是id為Button1的button.則可以看出postCollection參數其實是頁面所有實現了IPostBackDataHandler介面的回傳資料,而第一個參數postDataKey則是這個方法所屬控制項的uniqueid.

所以可以這樣來獲得本控制項這一次的回傳資料:

postCollection[postDataKey]

當然也可以獲得其他控制項這一次的回傳資料以達到和其它控制項的互動,比如:

postCollection[3]

 

下面通過一個Demo來展示IPostDataHandler

 

DEMO1  自己寫一個擁有狀態的TextBox控制項

     通過這個Demo可以更清楚的讓我們明白ViewState和PostBack Data之間通過實現IPostDataHandler的互動。

     代碼如下:

     [ToolboxData("<{0}:textboxDemo runat=server></{0}:textboxDemo>")]

    public class TextboxDemo : Control, IPostBackDataHandler

    {

        string _text;

        public virtual string Text

        {

            get

            {

                object text = ViewState["Text"];

                if (text == null)

                    return string.Empty;

                else

                    return (string)text;

            }

            set

            {

                ViewState["Text"] = value;

            }

        }

        public bool LoadPostData(string postDataKey,NameValueCollection postCollection)

        {

            Text = postCollection[postDataKey];

            return false;

        }

        public virtual void RaisePostDataChangedEvent()

        {

          

        }

        override protected void Render(HtmlTextWriter writer)

        {

            Page.VerifyRenderingInServerForm(this);

            base.Render(writer);

            //輸出 <INPUT type="text">標籤

            writer.Write("<INPUT type=""text"" name=""");

            writer.Write(this.UniqueID);

            writer.Write(""" value=""" + this.Text + """ />");

        }

}

這是一個簡單的TextBox實現。通過實現IPostBackDataHandler介面,我們可以在每次回傳到伺服器後儲存TextBox的狀態.即TextBox的Value的值.

     注意在Render方法裡有:Page.VerifyRenderingInServerForm(this);,這行代碼錶示此控制項必須在<form>標籤內,如果不在此標籤內,則會報錯.所有需要實現資料回傳的控制項最好都要使用這個方法.

TextBoxDemo控制項的使用方法這裡就不再累述了。

 

ASP.net控制項狀態

在asp.net 2.0以後的版本。可以通過設定控制項的EnableViewState屬性來控制單個控制項是否儲存其狀態。在一些訪問量比較大的網站上,如果不注意關閉不需要的ViewState,則使用者在每回提交時都會導致傳送額外的ViewState字串,這回導致效能問題.

控制項的狀態還有一個很棒的特性是在即使ViewState被禁用的情況下,控制項的狀態保持依然可用.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.