屬性全接觸(一)
本系列上篇文章有幾位抬愛,鼓勵了幾句,所以勁頭又足了,這不,這篇文章就出得快了,:)
希望能繼續得到鼓勵和指正。
這次我們來探討下控制項開發中的屬性設計的方方面面,屬性本是各種.net下語言的最基本文法,但控制項做為一種提供給程式員二次開發的發布件,其功能的強大與使用的靈活都離不開良好的屬性設計,所以我覺得屬性設計是控制項開發中第一座要打下的堡壘。
首先我們來看一段.aspx檔案中的HTML樣式的代碼:
<asp:DropDownList id="DropDownList1" runat="server" Font-Bold="True">
<asp:ListItem Value="1">1</asp:ListItem>
<asp:ListItem Value="2">2</asp:ListItem>
</asp:DropDownList>
這種代碼大家都寫過無數次了,不過,現在我們要從另一種角度來分析這段代碼:
DropDownList控制項在和使用者互動時,它沒有把它的屬性一股腦放在一起來表示出來,而是分為以下幾種情況:
1.像ID、Runat、Font-Bold這些,放在<>標記裡;
2.Font-Bold不同於其它,它有一個短橫分隔成兩部分,這種表示方式不是Font-Bold是一個屬性的名稱,而是說明它是一個子屬性,是Font屬性(Font類)的Bold屬性,對應.cs檔案的寫法是:Font.Bold;
3.ListItem放在了DropDownList的一雙<>標記的中間,而不是標記之類,同樣1、2也放在了ListItem的中間。
下面我們來分別看看這幾種屬性記錄方式是怎麼實現的。
有一個Attribute來做這件事件PersistenceMode(System.Web.UI.PersistenceModeAttribute)。
它有以下幾個值供選擇:
Attribute(default)屬性儲存在控制項的標籤裡;預設值
EnCodedInnerDefaultProperty 屬性是編碼的HTML,放在控制項標籤對的中間儲存,以上的ListItem就是這樣儲存Text屬性的(1、2);
[PersistenceMode(PersistenceMode.EnCodedInnerDefaultProperty)]
public string Text
{
}
InnerDefaultProperty 屬性儲存在控制項標籤對的中間,以上的DropDownList控制項的Items屬性就是這樣儲存的(就是那堆ListItem);
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public ListItem Items
{
get
{
}
}
InnerProperty 屬性和其它屬性一起儲存為控制項標籤對中的嵌套內容,DataGrid用這種方式把一堆東西包在標籤裡,這時,屬性要用標籤聲明,內含屬性值。
[PersistenceMode(PersistenceMode.InnerProperty)]
public virtual TableItemStyle ItemStyle
{
get
{
.
}
}
第二個議題,屬性的持久性
眾所周知,網頁是基於無狀態機制的,就是說,頁面Response後就不管理儲存頁面內容的狀態,ASP.net提供ViewState機制來儲存頁面的狀態,ViewState是實現方式是送出頁面中的一個名為__ViewState的input type='hidden',也就是說它和Session不同,它儲存在頁面中......不廢話了,反正我們要儲存控制項的狀態(就是它的各個屬性),而不至於在回傳的過程中丟失,我們採用的方案就是ViewState,下面簡單的舉個例子說明ViewState在Property中的用法
[
DefaultValue(2),
TypeConverter(typeof(Int32Converter)),
Category("Behavior"),
Description("Duration of complete once transition.(s)")
]
public int Duration
{
get
{
object b = ViewState["Duration"];
return (b==null)?2 int)b;
}
set
{
if(value < 1)
{
throw new ArgumentOutOfRangeException("Duration");
}
ViewState["Duration"] = value;
}
}
像這種方式直接使用ViewState是最簡便的,我們不必改寫LoadViewState、SaveViewState方法,至於怎麼自訂ViewState管理,在後面的文章中將有介紹。
關於屬性的東西太多了,這次就寫到這,下篇將寫寫怎樣訂製屬性與IDE的互動。