asp.net控件开发(二)-简单属性
一、屬性實現交互
我們還是沿用上面的例子來添加屬性 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)方法,來保存以前的初始化工作。
轉載于:https://www.cnblogs.com/yssoft/archive/2009/05/01/1447370.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的asp.net控件开发(二)-简单属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery Tab
- 下一篇: [Windows编程] #pragma