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的更多相关文章

  1. FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!

    一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...

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

    状态保存机制之ViewState概述及应用 作者: 字体:[增加 减小] 类型:转载   无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket ...

  3. Webform Application传值 ViewState

    Application:所有的会话共享一个Application空间,任何一个人改变Application的内容,其他人都会发现被改变了.Application中的内容不会被自动释放 存放位置:服务端 ...

  4. ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘

    开篇:经历了上一篇<aspx与服务器控件探秘>后,我们了解了aspx和服务器控件背后的故事.这篇我们开始走进WebForm状态保持的一大法宝—ViewState,对其刨根究底一下.然后,再 ...

  5. Webform Application、ViewState

    Application(全局对象) Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动 ...

  6. ViewState的用法

    学习标签: ViewState 本文导读:在web窗体控件设置为runat = "server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有 ...

  7. 服务器端控件同html控件的区别

    ●ASP.NET中共有几种类型的控件? 三种:1-asp.net控件(动态) 2-标准的html控件(静态) 3-标准的html控件加runat="server"属性(动态) 动态 ...

  8. C# 服务器端控件

    服务器端控件和客户端控件的比较? 区别:服务器端控件都会有个runat="Server"属性,这样才能够在后台对其进行设置修改,也就是在cs代码里面能对其修改设置.你做下测试 你放 ...

  9. 【转载】ViewState的用法

    本文导读:在web窗体控件设置为runat = "server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有控件在ViewState中的状态 ...

随机推荐

  1. poi过滤操作后产生新的sheet

    public Sheet filterSheet(Sheet sheetToFilter){ if(sheetToFilter == null){ System.out.println("s ...

  2. 无法解决 equal to 运算中 &quot;Chinese_PRC_CI_AS&quot; 和 &quot;SQL_Latin1_General_CP1_CI_AS&quot; 之间的排序规则冲突。

    什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许 ...

  3. Post 的数据被截断

    原因: Form 域 POST 提交数据 100K(可能不是这个值) 限制的解决方案   因为微软这个限制是对表单内每个域(第一个控件)的限制.问题的解决办法是,对于一个需要发送大数据的域,在提交表单 ...

  4. 6 高级IO函数

    6.1 pipe函数 pipe函数创建一个管道,用于实现进程间通信 #include<unistd.h> ]); 参数包含两个文件描述符fd[0]和fd[1],往fd[1]写入的数据可以从 ...

  5. Sqli-labs less 27

    Less-27 本关主要考察将union,select和26关过滤掉的字符.此处我们依旧和26关的方式是一样的,只需要将union和select改为大小写混合就可以突破. 示例:127.0.0.1/s ...

  6. Apache POI 解析 microsoft word 图片文字都不放过

    http://blog.csdn.net/njchenyi/article/details/6894500 http://haohaoxuexi.iteye.com/blog/2031335

  7. (2)jni编程学习笔记

    先说说NDK和jni的关系吧,这两个看起来挺容易搞混的 我到网上也查了一些资料: java的jni提供了一个调用c语言函数的接口,其实就是一个java函数,这个函数没有任何内容,这个函数调用时直接进入 ...

  8. converntion

    One convention that we have is to use the names of fruits and vegetables for variables(only in small ...

  9. JAVA实现Excel导出数据(以写好的Excel模版导出)

    工作中经常会有将后台数据以Excel导出的功能. 简单的方法有将response的contentType设置为application/vnd.ms-excel: 或在JSP页面直接设置成: <% ...

  10. 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 ...