ASP.NET組件設(shè)計(jì)之復(fù)雜屬性和狀態(tài)管理淺析
ASP.NET組件設(shè)計(jì)中復(fù)雜屬性和狀態(tài)管理的討論:
ASP.NET組件設(shè)計(jì)之復(fù)雜屬性聲明/持久:
所謂復(fù)雜屬性,即通常不可用CLR的基本數(shù)據(jù)類(lèi)型表達(dá)的屬性。譬如,F(xiàn)ontInfo,即代表字體屬性,包含Bold 、Name、Size、Color等信息(通常稱為子屬性)。
對(duì)于復(fù)雜屬性,控件在聲明時(shí)候,通常采用 屬性—子屬性 的連字符表示復(fù)雜屬性的一個(gè)子屬性。
- ﹤sdp:TextBox id=”Textbox1” Font-Name=”Vender” Font-Size=”12pt” runat=”server” /﹥
其中的劃線部分即代表了Font屬性。
復(fù)雜屬性的另外一種表達(dá)是,將復(fù)雜屬性嵌套放于控件聲明標(biāo)簽之中,乘坐 內(nèi)部屬性持久性(inner property persistence )。如:
- ﹤asp:DataGrid runat=”Server”﹥
- ﹤HeaderStyle ForeColor=”Red” /﹥
- ﹤/asp:DataGrid ﹥
復(fù)雜屬性序列化/持久化的設(shè)計(jì)時(shí)支持
設(shè)計(jì)時(shí)實(shí)現(xiàn)是在控件之外實(shí)現(xiàn)的,利用元數(shù)據(jù)(attribute)來(lái)實(shí)現(xiàn)。對(duì)于連字符實(shí)現(xiàn)的子屬性,經(jīng)過(guò)設(shè)定特定的attribute,即可影響設(shè)計(jì)器從而實(shí)現(xiàn)設(shè)計(jì)時(shí)支持。
DesignerSerializationVisibility 實(shí)際上在ASP.NET中是指DesignerSerializationVisibilityAttribute的屬性類(lèi),通過(guò)元數(shù)據(jù)中指定,并且設(shè)為:
DesignerSerializationVisibility.Content可以讓設(shè)計(jì)器知道,應(yīng)當(dāng)將復(fù)雜屬性的內(nèi)容進(jìn)行序列化而不是屬性本身
DesignerSerializationVisibility.Hidden 讓設(shè)計(jì)器忽略屬性和屬性內(nèi)容
DesignerSerializationVisibility.Visible 讓設(shè)計(jì)器以正常方式序列化
所謂正常方式,就是以字符傳、整型如果不屬于這些就用字節(jié)方式持久化屬性(當(dāng)然對(duì)于復(fù)雜屬性這相當(dāng)劃不來(lái))。
NotifyParentProperty(true) 表示屬性瀏覽器對(duì)控件得此復(fù)雜屬性的修改可以通告給控件,并告知之上的各個(gè)對(duì)象(通常會(huì)給設(shè)計(jì)器應(yīng)用程序),告知屬性已經(jīng)“臟”了。這些約定對(duì)控件設(shè)計(jì)者和設(shè)計(jì)器開(kāi)發(fā)者以及ASP.NET頁(yè)面的開(kāi)發(fā)者都很重要。
對(duì)于標(biāo)簽嵌套方式的屬性持久,應(yīng)當(dāng)采用ParseChilren(true)來(lái)指定屬性的持久,設(shè)計(jì)器實(shí)現(xiàn)嵌套方式則應(yīng)當(dāng)指定PersistChildren(false)讓設(shè)計(jì)器將嵌套標(biāo)簽轉(zhuǎn)化為復(fù)雜屬性的一部分(而不是內(nèi)嵌的子控件)
ASP.NET組件設(shè)計(jì)之類(lèi)型轉(zhuǎn)換器
為了解讀復(fù)雜屬性的持久形式為設(shè)計(jì)運(yùn)行時(shí)形式,需要對(duì)復(fù)雜屬性指定類(lèi)型轉(zhuǎn)換器,基本目標(biāo)是將持久形式解讀轉(zhuǎn)換為CLR支持的類(lèi)型,同時(shí)也將屬性的CLR類(lèi)型表達(dá)為設(shè)計(jì)時(shí)、運(yùn)行時(shí)的持久形式。即將Font-Size=”8pt”轉(zhuǎn)換為int32 的8,將復(fù)雜屬性的8持久化為Font-Size=”8pt”.
類(lèi)型轉(zhuǎn)換器的實(shí)現(xiàn)不依賴于任何用戶界面功能。因此,可在 Windows 窗體和 Web 窗體中應(yīng)用同一個(gè)類(lèi)型轉(zhuǎn)換器。
類(lèi)型轉(zhuǎn)換器繼承自System.ComponentModel.TypeConverter。
ASP.NET組件設(shè)計(jì)之實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換器的步驟:
1、 定義一個(gè)從 System.ComponentModel.TypeConverter 派生的類(lèi)。
2、 重寫(xiě) CanConvertFrom 方法,指定轉(zhuǎn)換器可從中轉(zhuǎn)換的類(lèi)型。此方法是重載方法。
3、 重寫(xiě)實(shí)現(xiàn)轉(zhuǎn)換的 ConvertFrom 方法。此方法是重載方法。
4、 重寫(xiě) CanConvertTo 方法,指定轉(zhuǎn)換器可轉(zhuǎn)換為的類(lèi)型。轉(zhuǎn)換為字符串類(lèi)型不需要重寫(xiě)此方法。此方法是重載方法。
5、 重寫(xiě)實(shí)現(xiàn)轉(zhuǎn)換的 ConvertTo 方法。此方法是重載方法。
6、 重寫(xiě)執(zhí)行驗(yàn)證的 IsValid 方法。此方法是重載方法。
通過(guò)TypeConverter(typeof(somecustimoziedTypeConverter))的方式確定某個(gè)屬性同特定的類(lèi)型轉(zhuǎn)換器相關(guān)。
對(duì)于ASP.NET應(yīng)用來(lái)講,如何保持兩個(gè)頁(yè)面間的控件的復(fù)雜屬性很重要。Control類(lèi)的默認(rèn)狀態(tài)管理交給ViewSatte字典,而復(fù)雜屬性,使用ViewState時(shí)不可能的,這必須用到IstateManager接口參與狀態(tài)管理。
- Interface IstateManager
- {
- public bool IsTrackingViewState ;
- //當(dāng)由類(lèi)實(shí)現(xiàn)時(shí),獲取一個(gè)值,通過(guò)該值指示服務(wù)器控件是否正在跟蹤其視圖狀態(tài)更改。
- void LoadViewState( object state);
- //當(dāng)由類(lèi)實(shí)現(xiàn)時(shí),加載服務(wù)器控件以前保存的控件視圖狀態(tài)。
- object SaveViewState();
- //當(dāng)由類(lèi)實(shí)現(xiàn)時(shí),將服務(wù)器控件的視圖狀態(tài)更改保存到 Object。
- void TrackViewState();
- //當(dāng)由類(lèi)實(shí)現(xiàn)時(shí),指示服務(wù)器控件跟蹤其視圖狀態(tài)更改。
- }
ASP.NET組件設(shè)計(jì)之Control,Control的ViewSatte屬性實(shí)際上就是一個(gè)復(fù)雜屬性,本質(zhì)上是一個(gè)字典類(lèi),通過(guò)實(shí)現(xiàn)了IstateManager接口參與狀態(tài)管理(ViewState的細(xì)節(jié)):
1、 ViewState的數(shù)據(jù)類(lèi)型是復(fù)雜屬性System.Web.UI.StateBag類(lèi)。實(shí)現(xiàn)IstateManager接口的字典。保存多項(xiàng)鍵/值對(duì),鍵為字符串,值為對(duì)象,當(dāng)某個(gè)對(duì)象自動(dòng)添加到State把實(shí)例即ViewState中去時(shí),自動(dòng)加入一個(gè)StateItem對(duì)象,存有實(shí)際的屬性值和相關(guān)的布爾標(biāo)志,知識(shí)此屬性(StateItem)在初始化后修改過(guò)。
2、 在接口的TrackViewState中將此函數(shù)的值對(duì)應(yīng)到StateBag的內(nèi)部布爾變量,如果為真,則當(dāng)StateItem添加時(shí)候(跟蹤一個(gè)對(duì)象的ViewState),或者修改行為,都將StateItem標(biāo)記為修改過(guò)。
3、 SaveViewSate中,枚舉項(xiàng)目,創(chuàng)建并返回兩個(gè)ArrayList分別標(biāo)記修改過(guò)的鍵和值。
4、 LoadViewSatet執(zhí)行SaveState的逆操作。
當(dāng)在ViewSatte中保存屬性時(shí)候,其狀態(tài)會(huì)自動(dòng)維護(hù)。可以在ViewState中保存任何控減災(zāi)往返傳送時(shí)需要的數(shù)(而不是全部數(shù)據(jù),從效率考慮剔除冗余數(shù)據(jù)),且任何保存在ViewState紅的數(shù)據(jù)必須時(shí)通過(guò)LosFormatter串行化的
所有復(fù)雜屬性的狀態(tài)保存應(yīng)當(dāng)實(shí)現(xiàn)IstateManager來(lái)將復(fù)雜屬性轉(zhuǎn)換為可以在ViewState中保存的簡(jiǎn)單屬性,并且也可以ViewState中保存的簡(jiǎn)單屬性恢復(fù)組合為復(fù)雜屬性。
ASP.NET組件設(shè)計(jì)之復(fù)雜屬性和狀態(tài)管理的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你學(xué)習(xí)ASP.NET組件設(shè)計(jì)中的復(fù)雜屬性和狀態(tài)管理有所幫助。
【編輯推薦】

















