状态保存机制之ViewState概述及应用

状态保存机制之ViewState概述及应用

作者: 字体:[增加 减小] 类型:转载

无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接,接下来介绍状态保存机制,感兴趣的朋友可以了解下

无状态Http

无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。

应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。

一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不能将状态信息保存到类变量中。

编写一个ashx

复制代码代码如下:

private int i;

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "text/plain";

context.Response.Write(i++);

}

多次刷新我们发现,变量根本不会记忆上次的值。

对网站造成的影响:如果用户录入了一些信息,当跳转到下一个页面时,数据丢失,再也不能获得那些数据。

如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方:

a.服务器端Session

b.浏览器端Cookie

c. 表单元素中—如:隐藏域<input type=“hidden”/>(Http报文)ViewState

四个重要的

ViewState:

ASP.NET 的 .aspx页面特有,页面级的;

就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;

服务器端控件的值都自动保存在ViewState中;

Cookie:

HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;

就是在客户端保存客户端单独使用的数据的一种方式;

就像你的病历本一样,医院直接给你带回家;

Session:和.Net提供的辅助进程相关。 

在服务器端保存客户端单独使用的数据的一种方式;

就像银行账户,钱都存在银行里,你就拿一张银行卡【所谓的SessionId】回家(写入客户端的Cookie中);

Application:

在服务器端保存共享数据的一种方式;

就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;

ViewState(页面级)

使用方式: 作用域---页面级

保存数据方式:

复制代码代码如下:

ViewState["myKey"]="MyData";

读取数据方式:

复制代码代码如下:

String myData;

if(ViewState["myKey"]!=null)

{

myData=(string)ViewState["myKey"];

}

ViewState不能存储所有的数据类型,仅支持:
String、Integer、Boolean、Array、ArrayList、Hashtable

使用ViewState的前提
页面上必须有一个服务器端窗体标记(<form runat=“server”>)

服务器在接收到用户请求一个页面后,会自动在请求报文中找看是否包含__VIEWSTATE的隐藏域,如果有,则将中间的值解码后添加到页面的ViewState属性中。

服务器在输出的时候,也会自动的将ViewState中的值添加到表单里名叫__VIEWSTATE的隐藏域中。

VIEWSTATE适用于同一个页面在不关闭的情况下多次与服务器交互

跨页面提交的__VIEWSTATE不会被目标页面装入页面的ViewState属性中

添加runat=server生成html页面源码如下

未添加如下:

__VIEWSTATE隐藏域生成的原理

复制代码代码如下:

//在页面类对象 执行PR方法的时候 先创建了控件树 然后通过执行 loadState方法 将请求报文中的名字为__VIEWSTATE的值 然后反base64编码 进行反序列化 最终还原成为集合 之后将其中属于程序员自己添加到ViewStatue里的键值对【ViewState会自动添加页面中runat=server控件的属性与状态】还原到页面对象的ViewState属性中 最后才执行Page_Load 原理 见图 
protected void Page_Load(object sender, EventArgs e){ 
//页面的ViewState属性实际上就是获取了浏览器提交过来的一个名为__VIEWSTATE的隐藏域里的值 
if (ViewState["name" ] != null){ 
string strName = ViewState["name" ].ToString(); 
Response.Write( "ViewState[‘name‘]" +strName); 
} else { 
//向 ViewState中添加一个键值对 
//ViewState.Add("name", "痞子一毛"); 同以下方式 
ViewState[ "name" ] = "痞子一毛" ; //实质就是向隐藏域中添加键值对 如果不被提交到服务器 那么ViewState["name"]永远为null 
ViewState[ "name2" ] = "痞子三毛" ; 

}

以上代码原理图解:

补充:

禁用ViewState的方法,禁用单个控件的ViewState设定enableviewstate=false。禁用整个页面的,在aspx的Page指令区加上EnableViewState="false" 。内网系统、互联网的后台可以尽情的用ViewState。但互联网前台就不要使用了【注:禁用也只是不保存服务端控件属性和值但隐藏域还是存在的】

WebForm的IsPostBack内部实现  就是对页面或者get传参中是否含有__ViewState这一参数名称进行判断返回bool值

证实:

复制代码代码如下:

protected void Page_Load(object sender, EventArgs e){ 
if (IsPostBack) //回传 
Response.Write( "只要浏览器提交的请求报文里包含__VIEWSTATE这个键" );//在该页面地址 http://localhost:7148/ViewSatate.aspx 末尾添加 ?__VIEWSTATE 会输出此段代码 
else 
Response.Write( "ASP.NET就会将页面的IsPostBack属性设置为true" );

状态保存机制之ViewState概述及应用,布布扣,bubuko.com

时间: 2024-10-08 10:29:15

状态保存机制之ViewState概述及应用的相关文章

页面状态保持机制(编辑中)

在ASPX页面中,每个控件的状态,通过VIEWSTATE进行保持,但前提是必须以回调的方式进行调用.我们的很多页面处理,都是以URL调用的方式进行的,无法使用VIEWSTATE. 在上例的分页处理中,使用了URL参数来传递状态,这种传递方式简单明了,但也存在问题: 1.复杂 2.和其他方式之间的共处存在问题 特别是第二点,在分页中体现得非常明显:既要能通过URL传递,还要允许页面控制,还要能传递新的参数.要实现这一要求,只能借助复杂的处理逻辑来实现了: 这种方式,当页面还有其他参数的时候,就会很

ASP.Net中的四种状态保持机制

本文档转载自http://blog.csdn.net/popping_dancer/article/details/7765464 因时间紧迫,未做个人笔记,仅参考. 这几天在学ASP.Net (就是传说中最难的东西)  上课刚听的时候的确有点听不懂 毕竟第一次接触每天晚上回来看视频的时候 才慢慢的恍然大悟 哦~~ 原来是这么回事呀 想必大牛们当初也是这样的感觉吧 哈哈 !今天来说说ASP.Net中的4种状态保持机制 状态保持机制?神马意思?别急 且听我下面慢慢道来 每个人上网可多有过这样的情况

Activity中使用注解进行状态保存

转载请注明出处:http://blog.csdn.net/allen315410/article/details/43567229 问题描述 一般开发中,当调用Activity生命周期方法onPause()和onStop()方法后,Activity的实例并没有被直接销毁,它仍然保存在内存中,Activity里面所有的信息和状态数据都将保存下来,当这个Activity重新回到前台的时候,所有的数据都会得到保留并且可被使用. 但是在一些特殊情况下,例如设备上装载了"XX大师""X

Android基础部分再学习---activity的状态保存

主要是bundle   这个參数 參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975 学习Activity的生命周期,我们知道,当Activity进入到paused或者stopped状态后,这个Activity的状态仍然保存着. 由于这个Activity对象仍然保存在内存中.它的全部信息和状态仍然是存在的.当这个Activity再次返回到前台是,它仍然保持着离开时候的样子. 然而.假设Activity进入到了后台.系统为

Android -- TabHost、Fragment、状态保存、通信

工程结构                                                                                       TabAFm到TabEFm都是Fragment,并且每个Fragment对应一个布局文件. TabAFm.java                                                                             package com.yydcdut.tabho

activity状态保存的bundl对象存放位置的思考

我们知道,当activity被异常终止时,可以把一些信息保存到bundle对象中,在下次启动时恢复. 那么,这个bundle对象是保存在哪里的呢? 这种状态保存的方法针对的是activity而不是进程,那么我们就可以猜测,这个对象是保存在内存中的,而不是存储设备上. 如果想对于进程进行数据保存等,应该使用外部存储来保存,在初始化的时候读取并恢复.

把状态保存

今天实现了把模拟状态保存为文件的功能. 当前的模拟对话框为: 模拟过后只需点 Save Simulation Result,即可保存结果. 结果包括初始位置initPos.内部点索引intPntIdx.表面点索引surfPntIdx.每一帧偏移量q.速度v.加速度a.参数值param 下一步实现模型的静态解算,就是给出一组表面点的运动序列,算出平衡位置下内部点的运动序列. 做一个切换开关,就是把参数连接到初始值. 模型的静态解算 模型的静态解算方法比较简单,利用  K = dF / dx 其中K

Android-Activity状态保存

Android-Activity状态保存 一 应用程序意外情况下的保存 1 onSaveInstanceState与onCreat的匹配使用, onPause之前调用 2 onRestoreInstanceState方法,在onCreate之后调用,系统一般情况下不使用 3 所以官方推荐我们都是用onCreate来恢复,因为有时候onRestoreInstanceState不会被调用 二 正常保存 1 屏蔽 onSaveInstanceState中系统的恢复 2 在onRestoreInstan

Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状态之外, 还需要用户手动保存一些成员变量. Fragment的状态有它自己的实例状态和其中的View状态, 因为其生命周期的灵活性和实际需要的不同, 情况会多一些. 根据源码, 列出了Fragment中实例状态和View状态保存和恢复的几个入口, 便于分析查看. 最后专门讲了WebView状态保存和