asp.net控制項開發(二)-簡單屬性

來源:互聯網
上載者:User
我們開發出來的控制項一般都需要跟使用控制項的人編程人員互動,其中互動有兩個途徑:一個是屬性還有就是事件。屬性可能是簡單的類型如:int、string等並不太複雜的類型,也有比較複雜的類型如:集合。

  一、屬性實現互動

  我們還是沿用上面的例子來添加屬性 PicShow樣本:

public class PicShow : Control
{
private string _imgUrl;
//屬性
public virtual string ImgUrl
{
get
{
return this._imgUrl;
}
set
{
this._imgUrl = value;
}
}
protected override void Render(HtmlTextWriter writer)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, "center");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100px");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
//Create Img Tag
writer.AddAttribute(HtmlTextWriterAttribute.Src, this.ImgUrl);
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "80px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "80px");
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
//End Of Div
writer.RenderEndTag();
}
}

  上面的樣本就是改變了上次的控制項只能指定死了圖片,這樣圖片的地址就可以由控制項的使用人員自己去指定了。控制項中定義了一個私人欄位,通過屬性ImgUrl來設定其值,因為我們允許重寫其屬性,所以定義成了virtual類型的。這裡的屬性定義跟一般類的定義是一樣的,就不多做說明。

  二、檢視狀態

  底下我們在一個項目中應用此控制項,但我們發現,這樣的控制項的屬性的狀態是沒法維持的。也就是說,它永遠只能維持我們初始給它的值。

  舉個例子:

http://www.w3.
org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
http://www.w3.org/1999/xhtml">
  
ImgUrl="Images/1109508867.jpg">
      onclick="btnChange_Click" />
我們通過按鈕來改變其屬性:
protected void btnChange_Click(object sender, EventArgs e)
{
if (this.psDemo.ImgUrl == "Images/1109508867.jpg")
this.psDemo.ImgUrl = "Images/bg.jpg";
else
this.psDemo.ImgUrl = "Images/1109508867.jpg";
}
運行後我們會發現,我們的圖片只能改變一次。原因很簡單,用戶端發出http請求後,伺服器端並沒有幫我們去維持上一次的請求資訊。
在有的時候我們必須要求其維持狀態。狀態分為兩種:一個是檢視狀態,一個是控制項狀態。

  檢視狀態在指令碼中的表現為:儲存到一個叫"_VIEWSTATE"的隱藏欄位中去,這樣來實現儲存上次的使用者請求。檢視狀態是一個集合(ViewState)。

  我們來繼承一個PicShow

public class viewStatePic : PicShow
{
public override string ImgUrl
{
get
{
string strImgUrl = (string)ViewState["ImgUrl"];
return (strImgUrl == null) ? String.Empty : strImgUrl;
}
set
{
ViewState["ImgUrl"] = value;
}
} 
}

  這裡我們只是把ImgUrl重寫了,通過視圖的狀態來實現的,這下子我們在使用時就可以維持上次使用者的請求。

  三、控制項狀態

  我們會發現如果使用者禁止使用了檢視狀態的話(在中添加EnableViewState="false"),我們還是維持不了使用者的上次請求,這時我們可以通過控制項狀態來永遠地維持。

  控制項狀態的維持一般分為三步:

  1、通過Page.RegisterRequiresControlState()方法來通知控制項運行時所在的頁面,把此控制項維持成控制項狀態。

  2、重寫SaveControlState()方法來儲存控制項狀態的值。

  3、最後再將控制項狀態的值返回到屬性中去。

  控制項狀態樣本:

public class ControlStatePic : Albumn
{
protected override void OnInit(EventArgs e)
{
Page.RegisterRequiresControlState(this);
base.OnInit(e);
}
protected override object SaveControlState()
{
return this.ImgUrl;
}
//從儲存的控制項視圖中取出來
protected override void LoadControlState(object savedState)
{
this.ImgUrl = savedState as string;
}
}

  注意的一點,我們在重寫OnInit方法時,我們只是需要要添加額外的功能,去註冊控制項狀態,所以一定要調用base.OnInit(e)方法,來儲存以前的初始化工作。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.