上一篇:动态的管理ASP.NET DataGrid数据列 >>
ASP.NET中的ViewState
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。
当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的,对用户来说是透明的。
使用ViewState的条件
如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form runat=server>)。窗体字段是必需的,这样包含 ViewState 信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET 页面框架才能添加隐藏的字段。
Page 的 EnableViewState 属性值为 true。
控件的 EnableViewState 属性值为 true。
页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。
设置ViewState
ViewState可以在控件,页,程序,全局配置中设置。缺省情况下 EnableViewState 为 true 。如果要禁止所有页面 ViewState 功能,可以在程序配置中把 EnableViewState 设为 false 。
在控件中:
<asp:DataGridEnableViewState="false"%>
或
DataGrid1.EnableViewState= false;
在页中:
<%@ PageEnableViewState="false" %>
或
Page.EnableViewState= false;
在程序中:
在web.config中加入
<pages enableViewState="false" />
在全局配置:
在machine.config中修改
<pages enableViewState="false" />
EnableViewState优先级别:
全局配置 < 程序 < 页< 控件
注意:下列服务器控件不能禁止ViewState
Textbox
Checkbox
Checkbox List
RadioButtonList
上面控件的状态通过IPostBackEventHandler 和 IPostBackDataHandler接口处理,而不是ViewState的机制,所以EnableViewState没有效果。
ViewState对象
在页面回传间通信,ASP中一般利用窗体的属性和 session 来存放数据,在 ASP.NET 中也可以使用 ViewState 对象来做同样的处理。
在ViewState存放数据:
ViewState[key]= value;
或
ViewState.Add(key,value);
取出数据:
TempStr =ViewState[key];
key不存在时返回空。
不能通过ViewState对象来访问控件的值。
动态建立控件的ViewState:
当需要动态地建立一个服务器控件,如下建立了一个 RadioButton 控件并加入到窗体控件集合中:
RadioButton rb = new RadioButton();
Page.Controls[1].Controls.Add(pc);
上面的代码增加一个控件到控件集合末,同样也可以插入到已有控件中的任何位置。
RadioButton rb = new RadioButton();
Page.Controls[1].Controls.AddAt(1,pc);
通常,这些动态生成的控件的状态也需要生成到 ViewState 中去,但这个功能并没有完全实现,特别是生成的控件插入到已有的控件中时。
当动态生成控件和已有控件并存时 ViewState 的结果是不可预料的。在页面回传时,首先非动态生成的控件在ASPX页中被生成,并在 Page_Init 和 Page_Load 事件中读取 ViewState。当页面的控件读取 ViewState 的值时,那些动态生成的控件却还没有被生成,所以当动态生成的控件被
生成时,页面就会省略掉ViewState或者以剩下或许错误的 ViewState 来填充控件。
所以,当需要插一个动态生成的控件到已有控件中去时,最好把这个控件的 ViewState 通过EnableViewState禁止掉。
提醒:
1. 当存在页面回传时,不需要维持控件的值就要把 ViewState 禁止。
2. ViewState的索引是大小写敏感的。
3. ViewState不是跨页面的。
4. 为了能包存在 ViewState 中,对象必须是可流化或者定义了 TypeConverter。
5. 控件 TextBox 的 TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。
6. 在页面没有回传 或 重定向 或 在回传中转到(transfer)其他页面时不要使用 ViewState。
7. 在动态建立控件时要小心它的 ViewState。
8. 当禁止一个程序的 ViewState 时,这个程序的所有页面的 ViewState 也被禁止了。
9. 只有当页面回传自身时ViewState 才是持续的。
最后略提一句在Stryon(http://www.stryon.com.cn)公司的产品iNET(转换.NET APP成Java代码,http://208.49.57.227:8080/downloads/Default.aspx )中用Java 实现ViewState ,使用上没什么区别。
下一篇:asp.net上传图片并同时生成缩略图 >>
相关文章:
- · asp+ 输入检查(e 文,转)
- · ASP+ 学习笔记 3
- · asp+中文教程(一)---- -asp+简介、安装、以及如何显示中文
- · asp+中文教程(二)---- Asp+ Web Forms
- · asp+中文教程(三)-- 服务器端控制(一)
- · ASP+ 学习笔记 4
- · ASP+ 学习笔记 2
- · 今日读 asp.net 心得 ---- 比较意识流,神经衰弱勿进
- · 用ASP.NET动态生成图像(转1)
- · Uploading Images to a Database - Part I (转)
- · 在ASP.NET中操作文件的例子(VB)
- · 在ASP.NET中处理 datetime 的一些通用函数(vb)
- · 用ASP.NET动态生成图像(转2)
- · 在 ASP.NET 中使用多个 runat=server form
- · ASP.NET实现HTTP方式获取功能
- · ASP.NET中的XML表单控件
- · Assembly和Import区别
- · 两个获取http页面的c#函数
- · asp.net实现pop功能
- · 深入讲解 ASP+ 验证 (转自ms 一)
- · 深入讲解 ASP+ 验证 (转自ms 二)
- · 使用 ASP+ 列表绑定控件 (转自ms 一)
- · 使用 ASP+ 列表绑定控件 (转自ms 二)
- · 查看服务器磁盘、文件的aspx
- · ASP+全新接触(1) {转}
- · 就是那个上传的。按实际上传时的文件名称保存(不在是test.jpg了)图片可以改大小,图上写字(可选字体...
- · ASP+全新接触(2) {转}
- · 用asp.net写的论坛程序
- · forum.aspx 论坛主页
- · reply.aspx 浏览贴子内容及回复
- · postmessage.aspx 上贴保存
- · .net的几个重要问题
- · 解决问题的方法:(JspFuns与开心的对话录)
- · 控件发布:带日期标注的日历控件。
- · 续上文:由于16K的限制,只能再接一节了。
- · 为什么我在中文win2000+sp1上装的vs.net不能创建各种web application,而英...
- · ASP.NET中密码保护,MD5和SHA1算法的使用
- · ASP。NET连SQL7接口源代码?
