Asp.net服务器控件编程(6) ViewState(二)——ViewState用法和IStateManager
本系列的第三章我们了解了ViewState的基础知识,也大概的了解了Aspx页面的生命周期,今天继续讲解ViewState的Asp.net服务器控件中的使用和复杂的ViewState管理。
ViewState的简单使用我们只要举个简单的例子即可:
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
namespace ClassLibrary1
{
public class Class1 : WebControl
{
private string _sex;
public string Sex
{
get
{
return _sex;
}
set
{
_sex = value;
}
}
public string Name
{
get
{
if (EnableViewState)
{
object o = ViewState["Name"];
if (o != null)
return (string)o;
else
return string.Empty;
}
else
return string.Empty;
}
set
{
if (EnableViewState)
ViewState["Name"] = value;
}
}
protected override void RenderChildren(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("Name:" + Name + "<br>");
writer.Write("Sex:" + Sex);
}
}
}
效果如下:
一个Aspx页面在提交和返回的过程会执行LoadViewState和SaveViewState两方法,这就是控件的状态并行化和串行化的过程,而这个过程是通过LosFormatter对象来完成的。Los 格式化程序用于高度压缩 ASCII 格式的序列化,它实现了整数、bool、字符串的串行,同时Array、ArrayList和HashTable的对象图进行了优化,控件保存在ViewState中的任何对象都必须由LosFormatter来串行化。
ViewState属性的类型是StateBag类,改类是个字典,它通过实现ISateManager接口参与状态管理。StateBag保存键/值对,其中键是字符串而值是对象,当某个对象添加到StateBag实例中时,StateBag自动为改对象添加一个附加位,它来存储对象是否被更改过。Control的状态管理默认都是由ViewState来完成,但是,当控件定义了复杂属性时,想用ViewState来自动管理这些属性就不可能了,所以我们复杂属性的自定义类型可以通过IStateManager接口来参与状态管理。IStateManager的原形如下:
bool IsTrackingViewState { get; }
void LoadViewState(object state);
object SaveViewState();
void TrackViewState();
在.net中Control类没有从IStateManager继承下来,但是Control却实现IStateManager的原形,这里的实现就不在举例来说明,如果需要的话,可以参考《ASP.NET服务器控件与组件开发》的183页。