【转】Asp.net控件开发学习笔记整理篇 - 数据回传
最近一直在做MVC項目,對于WEBFORM 好像快忘記了。周末無聊,順帶看看他人的筆記。再次溫習下。
復習大綱:
導航、頁面生命周期及其它導論
一、服務器控件生命周期
二、控件開發基礎
三、Asp.net服務端狀態管理
四、Asp.net客戶端狀態管理
五、數據回傳
六、WebControl基類
七、服務器控件事件
?
?在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被禁用的情況下,控件的狀態保持依然可用.
?
轉載于:https://www.cnblogs.com/taoqianbao/p/3486236.html
總結
以上是生活随笔為你收集整理的【转】Asp.net控件开发学习笔记整理篇 - 数据回传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exynos4412 Uboot 移植(
- 下一篇: Camera360与全球1.8亿用户共同