今天你寫控制項了嗎?—-ASP.net控制項開發系列(三)

來源:互聯網
上載者:User
屬性全接觸(一)

本系列上篇文章有幾位抬愛,鼓勵了幾句,所以勁頭又足了,這不,這篇文章就出得快了,:)
希望能繼續得到鼓勵和指正。
這次我們來探討下控制項開發中的屬性設計的方方面面,屬性本是各種.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的互動。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.