<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTkwNjc4NTIwMWRkyv4ncofW5vaWXdXRtXfXn3RYQR4=" />
也就是說VIEwState中的值實際上都是通過一個hidden來保存的,hidden的name為__VIEWSTATE,那麼如果頁面上有另外一個控件的名稱也叫:__VIEWSTATE的話,會導致頁面出錯。
protected void Button1_Click(object sender, EventArgs e)
{
Test test = ViewState["VIEW_TEST"] as Test;
if (test == null)
{
test = new Test();
}
test[-1] = TextBox1.Text;
ViewState["VIEW_TEST"] = test;
}
[SerializableAttribute]
class Test

{
private IList list;
public Test()
{
list = new ArrayList();
}
public object this[int index]
{
get
{
if (index >= list.Count)
{
return null;
}
return list[index];
}
set
{
list.Add(value);
}
}
}特別注意第一行的SerializableAttribute屬性,指定這個屬性後就代表此類是可以序列化的(具體序列化的過程都是由.Net內部進行的),那麼我們就可以把此類放入VIEwState中了,如果沒有指定SerializableAttribute屬性的話,放入VIEwState時就會報錯。
[SerializableAttribute]
class Test : DataTable

{
public Test()
{
DataColumn col = new DataColumn();
col.DataType = typeof(string);
col.ColumnName = "name";
this.Columns.Add(col);
}
public object this[int index]
{
get
{
if (index >= Rows.Count)
{
return null;
}
return Rows[index]["name"];
}
set
{
DataRow row = NewRow();
row["name"] = value;
Rows.Add(row);
}
}
}那麼再把這個類放入VIEwState的話就會報錯:此頁的狀態信息無效,可能已損壞,主要是因為它的父類DataTable是不可序列化的,我們就需要把這個類改造成如下形式:
[SerializableAttribute]
class Test : DataTable, System.Runtime.Serialization.ISerializable


public Test()
{
DataColumn col = new DataColumn();
col.DataType = typeof(string);
col.ColumnName = "name";
this.Columns.Add(col);
}
public object this[int index]
{
get
{
if (index >= Rows.Count)
{
return null;
}
return Rows[index]["name"];
}
set
{
DataRow row = NewRow();
row["name"] = value;
Rows.Add(row);
}
}
public Test(SerializationInfo info, StreamingContext context)
{
DataColumn col = new DataColumn();
col.DataType = typeof(string);
col.ColumnName = "name";
this.Columns.Add(col);
ArrayList list = info.GetValue("list", typeof(ArrayList)) as ArrayList;
foreach (string value in list)
{
DataRow row = NewRow();
row["name"] = value;
Rows.Add(row);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
ArrayList list = new ArrayList();
foreach (DataRow row in this.Rows)
{
list.Add(row["name"]);
}
info.AddValue("list", list);
}
}1、實現ISerializable接口