欢迎光临
我们一直在努力

ASP.NET中的ViewState-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

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 页面中必须有一个服务器端窗体标记 (<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 ,使用上没什么区别。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP.NET中的ViewState-.NET教程,Asp.Net开发
分享到: 更多 (0)