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被禁用的情況下,控制項的狀態保持依然可用.