一個控制項最基本的元素是屬性,屬性有好多種類型,在這節中我將先介紹以下簡單的屬性,拿一個我們最熟悉的控制項TextBox來說,Text(string),Enabled(bool),Columns(int)等都是屬性,這些就是我今天要講的簡單類型的屬性。
屬性的寫法很簡單,一般的屬性可以是可讀寫的,也可以是唯讀或者唯寫的,這都取決於屬性的“訪問器”,一般的寫法如下
class Pro
{
private string _readOnlyPro = "i'm readonly!";
private string _writeOnlyPro;
private string _readAndWritePro;
/// <summary>
/// 唯讀屬性
/// </summary>
public string ReadOnlyPro
{
get { return _readOnlyPro; }
}
/// <summary>
/// 唯寫屬性
/// </summary>
public string WriteOnlyPro
{
set { _writeOnlyPro = value; }
}
/// <summary>
/// 可讀寫屬性
/// </summary>
public string ReadAndWritePro
{
get { return _readAndWritePro; }
set { _readAndWritePro = value; }
}
}
上面代碼就為一個類添加3個屬性,分別是唯讀,唯寫,和可讀寫的屬性。
但是我在本系列第二節中講到的Web程式設計是要考慮到在一個web請求的期間之外來保持資訊的,這時我們就不能用簡單的私人變數來儲存屬性的值,要用到ViewSate,下面有一個例子說明了有用ViewState和沒有用ViewSats來儲存屬性之間的區別。
我先定義一個繼承自Control的類,裡面有一個屬性是用ViewState儲存的,而另外一個是用一個私人變數來儲存。
public class ViewStateControl : Control
{
/// <summary>
/// 使用了ViewState的屬性
/// </summary>
public string ViewStatePro
{
get
{
object obj = this.ViewState["ViewStatePro"];
if (obj != null)
{
return (string)obj;
}
return "";
}
set
{
this.ViewState["ViewStatePro"] = value;
}
}
private string _nonViewStatePro;
/// <summary>
/// 未使用ViewState的屬性
/// </summary>
public string NonViewStatePro
{
get
{
return _nonViewStatePro;
}
set
{
_nonViewStatePro = value;
}
}
/// <summary>
/// 擷取個屬性的值
/// </summary>
public string ProValues()
{
return "ViewStatePro's value is '" + this.ViewStatePro + "'<br/>NonViewStatePro's value is '" + this.NonViewStatePro + "'";
}
}
接下來我建立一個測試用的網頁,添加剛才ViewSateControl類所在程式集的引用後,在網頁上設計如下
<cc1:ViewStateControl ID="ViewStateControl1" runat="server" />
<asp:Button ID="btnSetValue" runat="server" Text="SetValue" OnClick="btnSetValue_Click" />
最後我在網頁的codebehind的cs代碼中的PageLoad事件中給2個屬性賦值,在Button的Click事件中讓它們顯示出來
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.ViewStateControl1.ViewStatePro = "hello";
this.ViewStateControl1.NonViewStatePro = "world";
}
}
protected void btnSetValue_Click(object sender, EventArgs e)
{
Response.Write(this.ViewStateControl1.ProValues());
}
運行程式後按下SetValue的Button可以看到顯示了ViewStatePro的值但是NonViewStatePro的值卻沒有顯示,這就說明了ViewStatePro的屬性在pageload中賦值的時候讓ViewState給儲存下來了,當按下Button後頁面postback這時存在ViewState中的值會在postback之後再次將postback之前的值再次賦給屬性ViewStatePro;而NonViewSatePro的屬性的儲存載體是一個私人變數,它並沒有存入ViewState,所以在按下Button後頁面postback,私人變數的值隨著頁面的生存周期的結束而一起被銷毀了。