文章 | 入侵攻击 | 安全防御 | 操作系统 | 网站建设 | 网络编程 | 路由交换 | 灾难恢复 | 新闻资讯 | 安全公告
下载 | 漏洞扫描 | 加密破解 | 入侵攻击 | 后门木马 | 溢出程序 | 综合工具 | 安全防护 | 原创发布 | 动画教程
论坛 | 黑客军火 | 配服务器 | 黑客情感 | 免费资源 | 美女贴图 | 灌水无罪 | 在线服务 | 会员照片 | 网站首页
 当前位置:主页 >> 技术文摘 >> 网络编程 >> NET编程 >> 文章内容  
 

 
ASP.NET中的ViewState

www.hx99.org 阅读: 时间:2007-07-12 整理:华西黑盟
------------------------------------------------------------------
 ASP.NET中的ViewState

转贴:chi0591日期:2003-07-28人气:64
ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。

 

ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。

当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的,对用户来说是透明的。

 

使用ViewState的条件
如果要使用ViewState,则在ASPX页面中必须有一个服务器端窗体标记(<formrunat=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中加入

<pagesenableViewState="false"/>
在全局配置:

在machine.config中修改

<pagesenableViewState="false"/>

EnableViewState优先级别:
全局配置<程序 <页<控件

注意:下列服务器控件不能禁止ViewState

Textbox
Checkbox
CheckboxList
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控件并加入到窗体控件集合中:

RadioButtonrb=newRadioButton();
Page.Controls[1].Controls.Add(pc);
上面的代码增加一个控件到控件集合末,同样也可以插入到已有控件中的任何位置。

RadioButtonrb=newRadioButton();
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(转换.NETAPP成Java代码,http://208.49.57.227:8080/downloads/Default.aspx )中用Java实现ViewState,使用上没什么区别。

   -------------------------------------------------------------------------------------------
  上一篇:ASP.NET中如何防范SQL注入式攻击
  下一篇:ASP.NET页面间的传值的几种方法
   -------------------------------------------------------------------------------------------
用户名:
Email:
评论内容:
 
  精品推荐
推荐:ASPX一句话木马--终
利用ASP.Net 动态生成HTML
asp.net实现验证码
在asp.net中利用session做
Asp.net 中在客户端触发服
Asp.net 中服务端控件事件
ASP.NET上传图片并生成可
ASP.NET AJAX解决网页打开
实现IE浏览器部分菜单命令
Asp.net一夜速成教程
从sqlserver中读取图片
ASP.NET页面间的传值的几
用动态属性和DataView实现
用PagedDataSource类实现D
关于TreeView控件专题
asp.net上传图片并同时生
ASP.NET中水晶报表的使用
ASP.NET 中 Cookie 的基本
ADO.NET使用经验集
Forms身份验证
ASP.NET四种页面导航方式
ASP.NET中如何防范SQL注入
[分享]ASP.NET学习手记```
ASP.NET编程中的十大技巧
用ASP.NET上传图片并生成
关于我们 | 发展历程 | 在线投稿 | 核心监督 | 友情链接 | 网站地图 | 网站留言 | 联系我们
Copyright © 2004-2007 Www.Hx99.Net
版本:华西黑盟网站系统V5.0 Email:root#hx99.org
中国·西安·宝鸡 请使用IE6.0版本, 分辩率1024×768进行浏览
版权所有 任意抄袭 注意完整
陕ICP备06000444号