状态保存机制之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概述及应用的更多相关文章

  1. Android Activity中状态保存机制

    在Activity中保存用户的当前操作状态,如输入框中的文本,一般情况下载按了home键后,重新进入文本框中的东西会丢下,所以我们要保存当前页面信息,如在写短信的时候接到一个电话,那么当你接电话的时候 ...

  2. web状态管理机制

    引入:b/s(浏览器/服务器模式)区别于winform的是winform中只加载一次页面构造函数,而b/s中只要点击按钮或者其他涉及后台的操作都会调用后台代码.一般情况下为了防止服务器过载,b/s不会 ...

  3. Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

    原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...

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

    主要是bundle   这个參数 參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975 学习Activity的生命周期,我们知 ...

  5. 【HTTP】三、HTTP状态保持机制(Cookie和Session)

      前面我们提到HTTP协议的特点:无连接.无状态.无连接带来的时间开销随着HTTP/1.1引入了持久连接的机制得到了解决.现在来关注其"无状态"的特点.   所谓的无状态,就是指 ...

  6. JavaWeb中Cookie会话管理,理解Http无状态处理机制

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

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

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  8. Activity生命周期与状态保存

    弹出系统对话框,程序仍部分可见 onPause 对话框消失时 onResume   调用一个新的Activity,老的Activity不可见时 onPause->onStop 从新的Activi ...

  9. Spark系列(六)Master注册机制和状态改变机制

    各组件的注册流程如下图: 注册机制源码说明: 入口:org.apache.spark.deploy.master文件下的receiveWithLogging方法中的case RegisterAppli ...

随机推荐

  1. [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt

    [TJOI2019]唱.跳.rap和篮球 这么多人过没人写题解啊 那我就随便说说了嗷 这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往 ...

  2. 9.Java web—JSP内置对象

    容器内置了9大对象,这些对象在jsp页无需实例化,可以直接使用. 分别为request. response .session. application .out. pageContext .confi ...

  3. 【spring boot jpa】hql语句报错 :antlr.NoViableAltException: unexpected token: roleName

    使用场景:在spring data jpa下使用@Query("hql语句") 然后在项目启动的时候报错 hql语句报错:antlr.NoViableAltException: u ...

  4. .net core mvc启动顺序以及主要部件1

    原文:.net core mvc启动顺序以及主要部件1 首先我是新人一个写这些东西也是为了增加记忆,有不对的地方请多多指教. 说回正题,打开Program.cs文件,看到在有个CrateWebHost ...

  5. 一道题目- Find the smallest range that includes at least one number from each of the k lists

    You have k lists of sorted integers. Find the smallest range that includes at least one number from ...

  6. BUPT复试专题—统计时间间隔(2013计院)

    题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别代表小时和分钟.0≤x<24,0≤y<60. 输入格式 第一行为 ...

  7. C++对象模型——Default Constructor的建构操作(第二章)

    第2章    构造函数语意学 (The Semantics of Constructor) 关于C++,最常听到的一个抱怨就是,编译器背着程序猿做了太多事情.Conversion运算符就是最常被引用的 ...

  8. WPF窗口最大化

    做C/S应用程序的过程中,要实现的一个功能是可以编辑系统某一类表,这些表又含有不同的properties,properties数量也不相同,有二十来个的,也有一两个的,所以,popUp出来之后大小各异 ...

  9. hdoj 4932 Miaomiao&#39;s Geometry 【暴力枚举】

    题意:在一条直线上有n个点.取一长度差为x的区间. 规定点必须是区间的端点. 让你找出来最大的x 策略:rt 分析可得:两个相邻点之间的区间要么是两个点的差,要么就是两个点的差的一半,那我们就简单枚举 ...

  10. Android app身体质量指数(BMI)

    针对中国人的标准身高体重来測算,提示您身体的健康状况. 提示您是否应该锻炼.节食或者补充营养等.第一时间知道您的健康状况. 下载地址:http://android.myapp.com/myapp/de ...