对象序列化(七):应用实例->asp.net ViewState
2012-02-15 00:29
447 查看
ViewState的使用比较简单,一两句话就可以了。
赋值:ViewState[key] = value;
取值:value = ViewState[key];
最主要的作用就是可以在当前页面保存值,ASP.NET的页面状态维护就是使用ViewState来实现的,基本上每一个ASPX页面都可以看到如下类似的html代码:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTkwNjc4NTIwMWRkyv4ncofW5vaWXdXRtXfXn3RYQR4=" />
也就是说ViewState中的值实际上都是通过一个hidden来保存的,hidden的name为__VIEWSTATE,那么如果页面上有另外一个控件的名称也叫:__VIEWSTATE的话,会导致页面出错。
其实在我们进行页面开发或者进行自定义控件开发的时候,都可以使用ViewState,很方便。
ViewState是ASP.NET中特有的,相对于Session来说,它保存的值只能在当前页面使用,并且保存的只能是已经序列化的类,比如.NET中的strings, integers, Booleans, arrays, ArrayList, hashtable,DataTable等。
那么如何将自定义的类放入ViewState中呢,这个就涉及到如下所说的序列化的问题了:
序列化简单来说就是把一个对象转化成一种可以持久保存的数据,当下次需要使用时再把之前保存的数据反序列化成一个对象。
当然在.NET中提供了简便的方法进行序列化的操作。
下面我以一个简单的例子来说明
将自定义类Test保存到viewstate中的按钮事件代码:
protected void Button1_Click(object sender, EventArgs e)
[SerializableAttribute]
class Test
[SerializableAttribute]
class Test : 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接口
2、实现GetObjectData方法,这个方法中就是把要序列化的对象放入info中,特别注意放入info中的对象本身必须是可以序列化的,如果放入一个DataRow对象,就会报错:未标记为可序列化
3、实现public Test(SerializationInfo info, StreamingContext context) 构造函数,这个函数就是一个反序列化的操作,把info中的对象取出来
经过上面的改造之后,就可以把这个Test对象放入ViewState中了
转自/article/4678833.html
赋值:ViewState[key] = value;
取值:value = ViewState[key];
最主要的作用就是可以在当前页面保存值,ASP.NET的页面状态维护就是使用ViewState来实现的,基本上每一个ASPX页面都可以看到如下类似的html代码:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTkwNjc4NTIwMWRkyv4ncofW5vaWXdXRtXfXn3RYQR4=" />
也就是说ViewState中的值实际上都是通过一个hidden来保存的,hidden的name为__VIEWSTATE,那么如果页面上有另外一个控件的名称也叫:__VIEWSTATE的话,会导致页面出错。
其实在我们进行页面开发或者进行自定义控件开发的时候,都可以使用ViewState,很方便。
ViewState是ASP.NET中特有的,相对于Session来说,它保存的值只能在当前页面使用,并且保存的只能是已经序列化的类,比如.NET中的strings, integers, Booleans, arrays, ArrayList, hashtable,DataTable等。
那么如何将自定义的类放入ViewState中呢,这个就涉及到如下所说的序列化的问题了:
序列化简单来说就是把一个对象转化成一种可以持久保存的数据,当下次需要使用时再把之前保存的数据反序列化成一个对象。
当然在.NET中提供了简便的方法进行序列化的操作。
下面我以一个简单的例子来说明
将自定义类Test保存到viewstate中的按钮事件代码:
protected void Button1_Click(object sender, EventArgs e)
[SerializableAttribute]
class Test
[SerializableAttribute]
class Test : 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接口
2、实现GetObjectData方法,这个方法中就是把要序列化的对象放入info中,特别注意放入info中的对象本身必须是可以序列化的,如果放入一个DataRow对象,就会报错:未标记为可序列化
3、实现public Test(SerializationInfo info, StreamingContext context) 构造函数,这个函数就是一个反序列化的操作,把info中的对象取出来
经过上面的改造之后,就可以把这个Test对象放入ViewState中了
转自/article/4678833.html
相关文章推荐
- 对 ASP.NET 中 ViewState 对象的荒谬认识
- asp.net f发布网站 出现未将对象应用到实例
- ASP.NET Application,Session,Cookie和ViewState等对象用法和区别
- 从零开始学习 ASP.NET MVC 1.0 (五) ViewEngine 深入解析与应用实例 【转】
- ASP.NET状态管理 APPlication,Session,Cookie和ViewState等对象用法和区别
- 转贴:ASP.NET中Application,Session,Cookie和ViewState等对象用法
- 对 ASP.NET 中 ViewState 对象的荒谬认识(转)
- ASP.NET Application,Session,Cookie和ViewState等对象用法和区别
- 从零开始学习 ASP.NET MVC 1.0 (五) ViewEngine 深入解析与应用实例
- 对象序列化(五):应用实例->大批量复制对象
- ASP.NET Application,Session,Cookie和ViewState等对象用法和区别
- 从零开始学习 ASP.NET MVC 1.0 (五) ViewEngine 深入解析与应用实例
- ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
- ASP.NET Application,Session,Cookie和ViewState等对象用法和区别
- ASP.NET Application,Session,Cookie和ViewState等对象用法和区别
- asp.net 隐藏页面<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=''>的值
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
- asp.net中viewState的应用
- 对象序列化(六):应用实例->程序退出时保存状态
- ASP.NET Application,Session,Cookie和ViewState等对象用法和区别 (转)