Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >页面状态保持机制(编辑中)

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

作者头像
用户1075292
发布于 2018-01-23 03:52:10
发布于 2018-01-23 03:52:10
1.2K00
代码可运行
举报
文章被收录于专栏:听雨堂听雨堂
运行总次数:0
代码可运行

Web应用程序中,有很多状态需要在页面的反复回调中能够保持住,还有一些状态需要在页面之间保持。对于状态的保持,是一个值得研究的问题。状态处理不当是页面失效或错误的一个重要的原因。

对于ASPX页面来说,控件可以通过VIEWSTATE来保持状态。VIEWSTATE机制非常好用,有时甚至可以用来保存页面后台代码中属性变量的状态值:因为变量的状态在回调时是不保存的,但是控件的状态却可以保持,因此可以通过控件来保持变量的状态,把控件设置为隐藏状态就不影响页面显示了。

但是VIEWSTATE却不能包打天下,我们的很多页面处理,都是以URL调用的方式进行的,如分页浏览,每次通过分页器进行的跳转都是新开页面,无法使用VIEWSTATE。

分页处理中,使用了URL参数来传递状态,这种传递方式简单明了,但也存在问题:

1、复杂。需要在URL中把各种状态全部写进去,一个都不能少。参数数量众多,考虑不周往往容易遗漏,还不好找原因。

2、和其他方式之间的协调问题。因为页面本身可能有回调操作,比如查询,或者其他的需要回调页面的控件操作,URL参数和回调参数之间的协调必须要精确的处理好。

特别是第二点,在分页浏览中体现得非常明显:既要能在不指定查询条件的情况下浏览所有数据,又要能够支持在回调事件中处理查询操作,还要能够把查询条件传递给新的分页器。要实现这一要求,只能借助复杂的处理逻辑来实现了。

这种需要在URL中传递所有参数的方式,在构造分页器链接的时候需要把页面所需的参数都显式地进行传递。当页面还有其他参数,特别是和分页无关的参数的时候,就会很难控制。构造分页器时,要去解析和分页无关的参数,要进行参数集合重复性的判断以及决定究竟哪个参数有效等。这些操作对于分页处理程序而言,既不合理也是隐患多多的。

基于页面的参数保持机制

参数传递的种种不便之处,使人不禁想到,为什么非要使用URL呢?URL方式,适合传递一些变化的参数。而上述的问题,都是由于一些需要保持的参数的传递而引起的。对于参数的保持,还有更加合适的手段:如Session或者Cookie。

那么,究竟选择Cookie还是Session呢?Session是一个进程级别的状态保存机制,在整个浏览过程中,在打开的所有页面之间,Session保存的数据都会有效。但Session也存在不足:

1、Session存放在服务器端,占用服务器的资源;

2、多个页面公用Session变量,容易导致混乱,如果每个页面都分别创建Session变量,则又造成资源的浪费;

3、Session本身有失效周期,在一些需要长期打开工作的页面,带来页面失效问题。

而Cookie相对来说,正好没有Session的不足。首先,Cookie不占用服务器资源,其次,Cookie按键-值的方式存储,正好可以用每个页面的名称为key,存储每个页面的状态。

根据各种应用的需要,基于页面的状态保持机制应该达到如下的要求:

1、页面回调时保持状态

2、页面跳转时保持状态

3、以Cookie方式存储数据

4、通过索引器的方式访问

5、兼容各种状态机制,自动尝试从URL、Session、Cookie中获取需要的参数值

6、只要使用过的参数,自动保持到Cookie中

页面状态保存机制的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// WebPage 的摘要说明
///    用于网页的参数的缓存,可以将多种类型的参数缓存起来:以Url中的参数权限最高。URL中的参数会自动保存在Cookie(以网页名称命名)中,每次可以自动加载Cookie。
///    非缓存参数,可以用Querystring来访问。
/// </summary>
public class WebPara
{
	Page page;  //所在的网页
	private Dictionary<string, string> Paras = new Dictionary<string, string>();
	string strPage;
	/// <summary>
	/// 构造函数
	/// </summary>
	public WebPara()
	{
		page = (Page)HttpContext.Current.Handler;
		init();
	}
	/// <summary>
	/// 构造
	/// </summary>
	/// <param name="WebPage"></param>
	public WebPara(Page WebPage)
	{
		page = WebPage;
		init();
	}

	void init()  //初始化
	{
		strPage = System.Text.RegularExpressions.Regex.Match(page.Request.FilePath, "(?<=/)[^/]*Aspx", System.Text.RegularExpressions.RegexOptions.IgnoreCase).Value.ToLower();  //页面统一为小写,cookie区分大小写

		//从cookie中加载所有的参数
		HttpCookie ParaCookie = page.Request.Cookies[strPage];  //以页面命名的Cookie
		if (ParaCookie != null)
		{
			for (int i = 0; i < ParaCookie.Values.AllKeys.Length; i++)
			{
				string parakey = ParaCookie.Values.AllKeys[i];
				Paras.Add(parakey.ToLower(),HttpUtility.UrlDecode(ParaCookie[parakey]));
			}
		}

		//从URL中覆盖加载参数
		for (int i = 0; i < page.Request.QueryString.Count; i++)
		{
			if (Paras.ContainsKey(page.Request.QueryString.GetKey(i).ToLower()))   //变量统一用小写
			{
				Paras[page.Request.QueryString.GetKey(i).ToLower()] = page.Request.QueryString[i];
			}
			else
				Paras.Add(page.Request.QueryString.GetKey(i).ToLower(), page.Request.QueryString[i]);
		}

		//回写所有参数到Cookie中
		foreach (KeyValuePair<string, string> kvp in Paras)
		{
			page.Response.Cookies[strPage][kvp.Key] = HttpUtility.UrlEncode(kvp.Value);
			page.Response.Cookies[strPage].Expires = DateTime.Now.AddDays(30);
		}
		//page.Response.Cookies[strPage].Expires = DateTime.Now.AddDays(1);  //保存一天
	}
	/// <summary>
	/// 参数索引。写入时,如果参数已经存在,则覆盖,否则创建
	/// </summary>
	/// <param name="ParaName"></param>
	/// <returns></returns>
	public string this[string ParaName]
	{   
		get
		{
			if (Paras.ContainsKey(ParaName.ToLower()))
			{
				return Paras[ParaName.ToLower()];
			}
			return "";
		}
		set  //有则覆盖,没有就添加
		{
			if (Paras.ContainsKey(ParaName.ToLower()))
			{
				Paras[ParaName.ToLower()] = value;
			}
			else
				Paras.Add(ParaName.ToLower(), value);

			//回写
			page.Response.Cookies[strPage][ParaName.ToLower()] = HttpUtility.UrlEncode(value);
			page.Response.Cookies[strPage].Expires = DateTime.Now.AddDays(30);

			//page.Response.Cookies[strPage][ParaName.ToLower()] = value;
		}
	}

	/// <summary>
	/// querystring中的变量,不存在则返回空
	/// </summary>
	/// <param name="ParaName"></param>
	/// <returns></returns>
	public string QueryString(string ParaName)
	{
		return StringUtil.ToStr(page.Request.QueryString[ParaName]);
	}
	/// <summary>
	/// 所有参数的信息
	/// </summary>
	/// <returns></returns>
	public string AllInfo()
	{
		string ret="";
		foreach (KeyValuePair<string, string> kvp in Paras)
		{
			ret += kvp.Key + ":" + kvp.Value + "\r\n";
		}
		return ret;
	}

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-05-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET保持用户状态的九种选择
摘要:ASP.NET为保持用户请求之间的数据提供了多种不同的途径。你可以使用Application对象、cookie、hidden fields、Sessions或Cache对象,以及它们的大量的方法。决定什么时候使用它们有时很困难。本文将介绍了上述的技术,给出了什么时候使用它们的一些指导。尽管这些技术中有些在传统ASP中已经存在,但是有了.NET框架组件后该在什么时候使用它们发生了变化。为了在ASP.NET中保持数据,你需要调整从先前的ASP中处理状态中学习到的知识。
Java架构师必看
2021/03/22
1.9K0
一个保存数据的方法(可以切换存放的位置,可以设置密钥)
      在asp.net里面一般的生命周期都比较短,如果想要比较长久的保存数据的话,一般有选择几种方式可供选择,即cookies、ViewState、Session、Cache、application等。他们各有优缺点,也各有其自己的使用范围。       我现在遇到了两个问题,第一个是如何在这几种方式里面快速、方便的切换,第二个是如何实现一个既可以区分用户,又可以区分页面,又节省服务器的资源,又比较安全的保存数据的方式。       ViewState比较符合第二个问题的要求,但是他不太安全,表面上看
用户1174620
2018/02/26
1.1K0
C#中HttpWebRequest的用法详解
HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的。请注意,HttpWebRequest对象不是利用new关键字通过构 造函数来创建的,而是利用工厂机制(factory mechanism)通过Create()方法来创建的。另外,你可能预计需要显式地调用一个“Send”方法,实际上不需要。接下来调用 HttpWebRequest.GetResponse()方法返回的是一个HttpWebResponse对象。你可以把HTTP响应的数据流 (stream)绑定到一个StreamReader对象,然后就可以通过ReadToEnd()方法把整个HTTP响应作为一个字符串取回。也可以通过 StreamReader.ReadLine()方法逐行取回HTTP响应的内容。
全栈程序员站长
2022/09/14
4.6K0
高性能缓存系统Memcached在ASP.NET MVC中应用
在Memcached中实体类型未经序列化不能在Memcached中缓存,因此需要对实体类进行处理,才能缓存下来.
Ryan_OVO
2023/10/18
2300
高性能缓存系统Memcached在ASP.NET MVC中应用
phantomjs API 中文版 无界面浏览器 js处理的爬虫
phantomjs [options] somescript.js [arg1 [arg2 […]]]
十四君
2019/11/27
1.8K0
【9】分页浏览的管理
阅读目录 分页关注的内容 状态的传递 数据的获取 查询结果的分页 跳页的实现 分页器的样式 页面的完整处理流程 分页关注的内容 前面博文中,通过自行构造HTML表格代码,可以生成易于管理、易于扩展的数据列表。但在实际应用中,数据量动则成百上千,单一页面根本无法完全显示所有数据。把所有数据进行分页后逐页显示,是当前比较流行的数据展示方式。因此,我们需要研究和表格方式展示数据相适应的分页管理机制。 分页显示的核心,是根据页面记录数、页号、查询条件、排序顺序等因素,在数据库中查出该页相对应的数据集(
用户1075292
2018/01/23
1.2K0
【9】分页浏览的管理
登录页面的代码
在把页面和数据库做好之后,我的登录页面只需要 用户名和密码 ,所以代码比较简单。 先找到登录按钮,给一个点击事件,然后再获取他们的表单值,然后对用户名和密码进行判断,判断是否填写了资料和是否是正确的账户和密码,在这之前还要检查登录页面是否是属于外层页面。dataValidationForm 是from表单的ID,用户名和密码必须要加上value
全栈程序员站长
2022/07/22
1.8K0
登录页面的代码
C# Web控件与数据感应之数据返写
数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,数据返写 ,是指将查询出来的数据,通过可显示数据的UI控件进行数据输出,如查询详情页,见下图:
初九之潜龙勿用
2024/06/29
1460
C# Web控件与数据感应之数据返写
Application Session Cookie ViewState Cache Hidden 区别
ASP.NET中,有多种保存信息的对象,如:Application,Session,Cookie,ViewState、Cache等,它们有什么区别?应用环境是什么?
阳光岛主
2019/02/19
8390
ASP.NET管理状态的十种途径
HTTP协议是无状态的,ASP.NET提供了丰富的手段在页面之间管理状态。本文列举ASP.NET管理状态的十种途径。
Java架构师必看
2021/03/22
6110
服务端(.Net)如何操作Cookies?
【摘要】Cookie是浏览器支持的,以键值对的方式存储变量和值,并保存至客户端的文本对象。通常在前端我们使用JavaScript能够很方便地操作Cookie。但是,有时候我们在服务端也需要对保存在客户端的Cookie进行操作,比如进行身份验证等。那么,基于.NET技术,在服务端我们如何操作Cookie呢?
高一峰
2020/09/22
1.6K0
Asp.net_Study学习笔记
HTTP Error 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。
Echo_Wish
2023/11/30
2720
Asp.net_Study学习笔记
基于Redis缓存的Session共享(附源码)
    在上一篇文章中我们研究了Redis的安装及一些基本的缓存操作,今天我们就利用Redis缓存实现一个Session共享,基于.NET平台的Seesion共享用的最多的应该是SQLServer数据库实现,我之前参与的一个项目么么亲子社区就是用的SQLSERVER实现不同子域名之间的Session共享。先打个广告嘿嘿,么么亲子网:enmuo.com,i.enmuo.com就是通过SQLSERVER实现Session共享 欢迎大家访问。
写代码的猿
2019/04/11
1K0
基于Redis缓存的Session共享(附源码)
C#开发BIMFACE系列36 服务端API之:回调机制
  在《C# 开发 BIMFACE 系列文章》中介绍了模型转换、模型对比接口。这2个功能接口比较特殊,发起请求后,逻辑处理是在BIMFACE云端进行的,通常需要5~10分钟。当逻辑处理完成后,BIMFACE通过回调机制通知对比结果。
张传宁IT讲堂
2020/03/18
5280
ASP.NET中Cookie跨域的问题及解决代码
http://www.liyumei.net.cn/post/share18.html
跟着阿笨一起玩NET
2018/09/20
1.8K0
C# 实现改造 GooFlow 流程图插件与数据库应用的结合
GooFlow 一个基于 Jquery/FontAwesome 的流程图/架构图画图插件,本文介绍的是基于JS的一个版本,能够适用于大部分支持H5的浏览器。通过创建画布,我们可以在其上通过工具栏绘制想要绘制的流程图/框/线等,如下图所示:
初九之潜龙勿用
2024/08/14
2500
C# 实现改造 GooFlow 流程图插件与数据库应用的结合
cookie细节问题
1、cookie是和浏览器相关的,不同的浏览器cookie信息是不能公用的~!! 2、浏览器开了。隐身模式的话,cookie信息也是读取不到的~!! 3、手动的将浏览器中的cookie信息删除后,也是读取不到cookie信息~!!
静心物语313
2020/03/24
3500
cookie细节问题
【详细】.NET企业微信回调配置(数据回调URL和指令回调URL验证)
  前段时间因为公司业务需求,需要将微信小程序与企业微信对接通,也就是把小程序绑定到对应的企业微信账号下,在该企业微信的用户可以将该小程序绑定到工作台中,然后可以在工作台中打开该小程序并授权。不过将微信小程序与企业微信对接通需要后台去做数据回调URL和指令回调URL验证,因为第一次接触这个然后企业微信文档写的也不是很详细,并且在全网没有找到一篇.NET相关企业微信回调配置验证有用的文章,所以这里把自己的配置详细过程分享出来,希望能够帮助更多的同学。
追逐时光者
2021/09/09
3.9K0
【详细】.NET企业微信回调配置(数据回调URL和指令回调URL验证)
C# Web控件与数据感应之 BaseDataList 类
数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,本文将继续介绍以与数据库提取数据并捆绑控件为例,讲解 C# 创建适用于 BaseDataList 类(如DataGrid)的通用分页数据显示方法。
初九之潜龙勿用
2024/06/20
1060
C# Web控件与数据感应之 BaseDataList 类
基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)
基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一)
程序猿小亮
2021/01/29
1.2K0
相关推荐
ASP.NET保持用户状态的九种选择
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验