当有一个传统的Property时,是否你想到了下面的代码呢~:
public string Text {
get { return _text; }
set { _text = value; }
}
可是大多数ASP.NET控件的properties并不是这样的。而是,他们使用了ViewState来作状态的保持
再给一个ViewState的使用小例子吧:
public string Text {
get { return (string)ViewState["Text"]; }
set { ViewState["Text"] = value; }
}
如果你想附给他一个默认值,很显然你会这么做:
public class MyClass {
private string _text = "Default Value!";
public string Text {
get { return _text; }
set { _text = value; }
}
}
但是如果你既想给他一个默认值,又想保持该Property的状态,那我们该怎么办呢~?就是下面这样:
public string Text {
get { return ViewState["Text"] == null ? "Default Value!" : (string)ViewState["Text"]; }
set { ViewState["Text"] = value; }
}
是不是相当简单?呵呵
这样使用ViewState是最简单的,你并不用重写LoadViewState、SaveViewState等方法,至于ViewState,我们现在只知道他是用来在客户端增加一个隐藏字段来保存状态的东东,你也许会说:这样一个东西也要开篇文章来写么~?
为了详细解释ViewState,下面我们要牵扯到ViewState在自定义控件中的作用了,而对于ViewState的讲解将贯穿我们重写DropDownList的始末。
下面的时间我们将一起来写一个自定义控件,他的功能和基本的DropDownList是一样的。
首先我们合计下需要几个类:
在一个.aspx页面添加一个DropDownList控件,他的基本代码应该是这样的:
<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类和ListItem类,其中 ListItem 负责子属性的功能, DropDownList 负责是一个容器类,在外面包裹着一组 ListItem ,一组 ListItem ?那看来我们还需要一个 Collection 来放置整个 ListItem 来方便 ListItem 的操作。 这时候忽然想到一个设计模式的原则:面向接口而不是面向实现编程。我们做这个控件的时候是否在 ListItem 和 DropDownList 的上面抽象出来一个抽象类来方便扩展(这是自己想的,欢迎大大们指摘不足)?那我们就附加两个抽象类 ABaseListItem 和 ABaseDropDownList.
OK,现在大体的结构已经定下来了,包括5个类ABaseListItem ,ABaseDropDownList ,ItemCollection , ListItem 和 DropDownList.下面让我们具体实现他,以此来真正了解下ViewState和asp.net的基本流程吧。
(to be continue^_^)