本篇內(nèi)容介紹了“ASP.NET復(fù)雜屬性和狀態(tài)管理舉例分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
站在用戶的角度思考問題,與客戶深入溝通,找到衛(wèi)輝網(wǎng)站設(shè)計與衛(wèi)輝網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋衛(wèi)輝地區(qū)。
ASP.NET組件設(shè)計之復(fù)雜屬性聲明/持久:
所謂復(fù)雜屬性,即通常不可用CLR的基本數(shù)據(jù)類型表達的屬性。譬如,F(xiàn)ontInfo,即代表字體屬性,包含Bold 、Name、Size、Color等信息(通常稱為子屬性)。
對于復(fù)雜屬性,控件在聲明時候,通常采用 屬性—子屬性 的連字符表示復(fù)雜屬性的一個子屬性。
﹤sdp:TextBox id=”Textbox1” Font-Name=”Vender” Font-Size=”12pt” runat=”server” /﹥
其中的劃線部分即代表了Font屬性。
復(fù)雜屬性的另外一種表達是,將復(fù)雜屬性嵌套放于控件聲明標簽之中,乘坐 內(nèi)部屬性持久性(inner property persistence )。如:
﹤asp:DataGrid runat=”Server”﹥ ﹤HeaderStyle ForeColor=”Red” /﹥ ﹤/asp:DataGrid ﹥
復(fù)雜屬性序列化/持久化的設(shè)計時支持
設(shè)計時實現(xiàn)是在控件之外實現(xiàn)的,利用元數(shù)據(jù)(attribute)來實現(xiàn)。對于連字符實現(xiàn)的子屬性,經(jīng)過設(shè)定特定的attribute,即可影響設(shè)計器從而實現(xiàn)設(shè)計時支持。
DesignerSerializationVisibility 實際上在ASP.NET中是指DesignerSerializationVisibilityAttribute的屬性類,通過元數(shù)據(jù)中指定,并且設(shè)為:
DesignerSerializationVisibility.Content可以讓設(shè)計器知道,應(yīng)當將復(fù)雜屬性的內(nèi)容進行序列化而不是屬性本身
DesignerSerializationVisibility.Hidden 讓設(shè)計器忽略屬性和屬性內(nèi)容
DesignerSerializationVisibility.Visible 讓設(shè)計器以正常方式序列化
所謂正常方式,就是以字符傳、整型如果不屬于這些就用字節(jié)方式持久化屬性(當然對于復(fù)雜屬性這相當劃不來)。
NotifyParentProperty(true) 表示屬性瀏覽器對控件得此復(fù)雜屬性的修改可以通告給控件,并告知之上的各個對象(通常會給設(shè)計器應(yīng)用程序),告知屬性已經(jīng)“臟”了。這些約定對控件設(shè)計者和設(shè)計器開發(fā)者以及ASP.NET頁面的開發(fā)者都很重要。
對于標簽嵌套方式的屬性持久,應(yīng)當采用ParseChilren(true)來指定屬性的持久,設(shè)計器實現(xiàn)嵌套方式則應(yīng)當指定PersistChildren(false)讓設(shè)計器將嵌套標簽轉(zhuǎn)化為復(fù)雜屬性的一部分(而不是內(nèi)嵌的子控件)
ASP.NET組件設(shè)計之類型轉(zhuǎn)換器
為了解讀復(fù)雜屬性的持久形式為設(shè)計運行時形式,需要對復(fù)雜屬性指定類型轉(zhuǎn)換器,基本目標是將持久形式解讀轉(zhuǎn)換為CLR支持的類型,同時也將屬性的CLR類型表達為設(shè)計時、運行時的持久形式。即將Font-Size=”8pt”轉(zhuǎn)換為int32 的8,將復(fù)雜屬性的8持久化為Font-Size=”8pt”.
類型轉(zhuǎn)換器的實現(xiàn)不依賴于任何用戶界面功能。因此,可在 Windows 窗體和 Web 窗體中應(yīng)用同一個類型轉(zhuǎn)換器。
類型轉(zhuǎn)換器繼承自System.ComponentModel.TypeConverter。
ASP.NET組件設(shè)計之實現(xiàn)類型轉(zhuǎn)換器的步驟:
1、 定義一個從 System.ComponentModel.TypeConverter 派生的類。
2、 重寫 CanConvertFrom 方法,指定轉(zhuǎn)換器可從中轉(zhuǎn)換的類型。此方法是重載方法。
3、 重寫實現(xiàn)轉(zhuǎn)換的 ConvertFrom 方法。此方法是重載方法。
4、 重寫 CanConvertTo 方法,指定轉(zhuǎn)換器可轉(zhuǎn)換為的類型。轉(zhuǎn)換為字符串類型不需要重寫此方法。此方法是重載方法。
5、 重寫實現(xiàn)轉(zhuǎn)換的 ConvertTo 方法。此方法是重載方法。
6、 重寫執(zhí)行驗證的 IsValid 方法。此方法是重載方法。
通過TypeConverter(typeof(somecustimoziedTypeConverter))的方式確定某個屬性同特定的類型轉(zhuǎn)換器相關(guān)。
對于ASP.NET應(yīng)用來講,如何保持兩個頁面間的控件的復(fù)雜屬性很重要。Control類的默認狀態(tài)管理交給ViewSatte字典,而復(fù)雜屬性,使用ViewState時不可能的,這必須用到IstateManager接口參與狀態(tài)管理。
Interface IstateManager { public bool IsTrackingViewState ; //當由類實現(xiàn)時,獲取一個值,通過該值指示服務(wù)器控件是否正在跟蹤其視圖狀態(tài)更改。 void LoadViewState( object state); //當由類實現(xiàn)時,加載服務(wù)器控件以前保存的控件視圖狀態(tài)。 object SaveViewState(); //當由類實現(xiàn)時,將服務(wù)器控件的視圖狀態(tài)更改保存到 Object。 void TrackViewState();//當由類實現(xiàn)時,指示服務(wù)器控件跟蹤其視圖狀態(tài)更改。 }
ASP.NET組件設(shè)計之Control,Control的ViewSatte屬性實際上就是一個復(fù)雜屬性,本質(zhì)上是一個字典類,通過實現(xiàn)了IstateManager接口參與狀態(tài)管理(ViewState的細節(jié)):
1、 ViewState的數(shù)據(jù)類型是復(fù)雜屬性System.Web.UI.StateBag類。實現(xiàn)IstateManager接口的字典。保存多項鍵/值對,鍵為字符串,值為對象,當某個對象自動添加到State把實例即ViewState中去時,自動加入一個StateItem對象,存有實際的屬性值和相關(guān)的布爾標志,知識此屬性(StateItem)在初始化后修改過。
2、 在接口的TrackViewState中將此函數(shù)的值對應(yīng)到StateBag的內(nèi)部布爾變量,如果為真,則當StateItem添加時候(跟蹤一個對象的ViewState),或者修改行為,都將StateItem標記為修改過。
3、 SaveViewSate中,枚舉項目,創(chuàng)建并返回兩個ArrayList分別標記修改過的鍵和值。
4、 LoadViewSatet執(zhí)行SaveState的逆操作。
當在ViewSatte中保存屬性時候,其狀態(tài)會自動維護??梢栽赩iewState中保存任何控減災(zāi)往返傳送時需要的數(shù)(而不是全部數(shù)據(jù),從效率考慮剔除冗余數(shù)據(jù)),且任何保存在ViewState紅的數(shù)據(jù)必須時通過LosFormatter串行化的
所有復(fù)雜屬性的狀態(tài)保存應(yīng)當實現(xiàn)IstateManager來將復(fù)雜屬性轉(zhuǎn)換為可以在ViewState中保存的簡單屬性,并且也可以ViewState中保存的簡單屬性恢復(fù)組合為復(fù)雜屬性。
“ASP.NET復(fù)雜屬性和狀態(tài)管理舉例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!