在服务器端保存ViewState
1.比较
Asp.net 的一个强大的功能就是ViewState, 但是这也成为很多人诟病的地方,我们先来看一个实例
ViewState其中一个特性就是保存页面的状态,下面我们看一个很简单的登录页面。
(1) 默认的页面存储
下面两幅图是使用默认的ViewState, Asp.net把状态保存在页面的一个Hidden控件里。每次请求时往返于客户端与服务器之间,我们可以看到储存了很多的值,页面大小是28.2K。
![]()
![]()
(2)自定义的Cache存储
下面两幅图是我们使用自定义的Cache存储,页面的大小是27.5K,虽然不到1K,但这个页面的结构比较简单,如果复杂的,如用了GridView等,这个差别还是比较大的
![]()
![]()
(3)扩展
实际上ASP.NET2.0 给我们提供了改变存储的功能,这个是通过覆盖Page的PageStatePersister
protected override PageStatePersister PageStatePersister
而且ASP.NET2.0给内置了一个SessionPageStatePersister. 可以容易的把ViewState存到Session里
return new SessionPageStatePersister(page);
2. 示例
这里我给出自定义的一个实例
(1)开发一个ViewStateFactory,根据不同的配置,修改存储方式。
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.Caching;
namespace TestViewState
{
public enum ViewstateMode
{
Cache,
Session,
Page,
File,
Database
}
public class ViewStateFactory
{
public ViewStateFactory()
{
//
// TODO: Add constructor logic here
//
}
public static PageStatePersister CreateViewState(ViewstateMode mode, Page page)
{
switch (mode)
{
case ViewstateMode.Cache:
return new CacheStatePersister(page);
case ViewstateMode.Session:
return new SessionPageStatePersister(page);
case ViewstateMode.Page:
case ViewstateMode.File:
case ViewstateMode.Database:
return new HiddenFieldPageStatePersister(page);
default:
return new HiddenFieldPageStatePersister(page);
}
}
}
//实现一个自定义的方式,存储到服务器的Cache里
public class CacheStatePersister : PageStatePersister
{
private Cache mCache = HttpRuntime.Cache;
public CacheStatePersister(Page page) : base(page) { }
public override void Load()
{
string _vskey = Page.Request.Form["_VIEWSTATE_KEY"];
if (_vskey == null)
{
base.ViewState = null;
}
else
{
base.ViewState = mCache[_vskey];
}
}
public override void Save()
{
string _vskey;
_vskey = "VIEWSTATE_" + HttpContext.Current.Session.SessionID + "_" + Page.Request.RawUrl +
"_" + System.DateTime.Now.Ticks.ToString();
mCache.Add(_vskey, base.ViewState, null,
System.DateTime.Now.AddMinutes(HttpContext.Current.Session.Timeout), Cache.NoSlidingExpiration,
CacheItemPriority.Default, null);
this.Page.RegisterHiddenField("_VIEWSTATE_KEY", _vskey);
}
}
}
(2)为了可以配置,我们在Web.config的AppSetting里加上
<!--this is for where save viewstate, correct value is Cache, Page, Session-->
<add key="ViewStateMode" value="Cache"/>
(3)覆盖页面的PageStatePersister,这里你可以开发一个BasePage,在基类里覆盖,所有的页面集成这个页面
protected override PageStatePersister PageStatePersister
{
get
{
ViewstateMode viewstateMode = ViewstateMode.Page;
try
{
switch (ConfigManager.ViewStateMode.ToLower())
{
case "cache":
viewstateMode = ViewstateMode.Cache;
break;
case "session":
viewstateMode = ViewstateMode.Session;
break;
default:
viewstateMode = ViewstateMode.Page;
break;
}
return ViewStateFactory.CreateViewState(viewstateMode, this.Page);
}
catch (Exception ex)
{
return base.PageStatePersister;
}
}
}
在服务器端保存ViewState的更多相关文章
- FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!
一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...
- 状态保存机制之ViewState概述及应用
状态保存机制之ViewState概述及应用 作者: 字体:[增加 减小] 类型:转载 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket ...
- Webform Application传值 ViewState
Application:所有的会话共享一个Application空间,任何一个人改变Application的内容,其他人都会发现被改变了.Application中的内容不会被自动释放 存放位置:服务端 ...
- ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘
开篇:经历了上一篇<aspx与服务器控件探秘>后,我们了解了aspx和服务器控件背后的故事.这篇我们开始走进WebForm状态保持的一大法宝—ViewState,对其刨根究底一下.然后,再 ...
- Webform Application、ViewState
Application(全局对象) Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动 ...
- ViewState的用法
学习标签: ViewState 本文导读:在web窗体控件设置为runat = "server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有 ...
- 服务器端控件同html控件的区别
●ASP.NET中共有几种类型的控件? 三种:1-asp.net控件(动态) 2-标准的html控件(静态) 3-标准的html控件加runat="server"属性(动态) 动态 ...
- C# 服务器端控件
服务器端控件和客户端控件的比较? 区别:服务器端控件都会有个runat="Server"属性,这样才能够在后台对其进行设置修改,也就是在cs代码里面能对其修改设置.你做下测试 你放 ...
- 【转载】ViewState的用法
本文导读:在web窗体控件设置为runat = "server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有控件在ViewState中的状态 ...
随机推荐
- poi过滤操作后产生新的sheet
public Sheet filterSheet(Sheet sheetToFilter){ if(sheetToFilter == null){ System.out.println("s ...
- 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突。
什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许 ...
- Post 的数据被截断
原因: Form 域 POST 提交数据 100K(可能不是这个值) 限制的解决方案 因为微软这个限制是对表单内每个域(第一个控件)的限制.问题的解决办法是,对于一个需要发送大数据的域,在提交表单 ...
- 6 高级IO函数
6.1 pipe函数 pipe函数创建一个管道,用于实现进程间通信 #include<unistd.h> ]); 参数包含两个文件描述符fd[0]和fd[1],往fd[1]写入的数据可以从 ...
- Sqli-labs less 27
Less-27 本关主要考察将union,select和26关过滤掉的字符.此处我们依旧和26关的方式是一样的,只需要将union和select改为大小写混合就可以突破. 示例:127.0.0.1/s ...
- Apache POI 解析 microsoft word 图片文字都不放过
http://blog.csdn.net/njchenyi/article/details/6894500 http://haohaoxuexi.iteye.com/blog/2031335
- (2)jni编程学习笔记
先说说NDK和jni的关系吧,这两个看起来挺容易搞混的 我到网上也查了一些资料: java的jni提供了一个调用c语言函数的接口,其实就是一个java函数,这个函数没有任何内容,这个函数调用时直接进入 ...
- converntion
One convention that we have is to use the names of fruits and vegetables for variables(only in small ...
- JAVA实现Excel导出数据(以写好的Excel模版导出)
工作中经常会有将后台数据以Excel导出的功能. 简单的方法有将response的contentType设置为application/vnd.ms-excel: 或在JSP页面直接设置成: <% ...
- Things about single men that women hate
Things about single men that women hate为何你俘获不了女神的心?If you listen in to a group of single women talki ...