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. R 实例1

    //转载:http://www.r-china.net/forum.php?mod=viewthread&tid=881&extra=page%3D1//用R抓取人民日报网数据 lib ...

  2. WCF基本概念

    WCF是基于Windows平台下开发和部署服务的SDK.服务是一组公开的功能集合. 面向服务(Service Orientatio,SO)是一组原则的抽象, 面向服务的应用程序(SOA)将众多服务聚集 ...

  3. Leetcode#59 Spiral Matrix II

    原题地址 相比于Spiral Matrix(参见这篇文章)要简单一些,因为是方阵,所以代码简洁一些. 注意当n是奇数的时候,中心小块要单独赋值(代码21行) 代码: vector<vector& ...

  4. String str=new String("a")和String str = "a"有什么区别?

    问:String str=new String("a")和String str = "a"有什么区别? 答:String str = "a" ...

  5. JS This关键字

    http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html http://www.cnblogs.com/ ...

  6. Jquery 中map和each的区别

    <script type="text/javascript"> $(function () { var json = {"Name":"L ...

  7. Xcode 创建静态库和动态库

    1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件 ...

  8. Android View体系

  9. js小技巧(二)

    //移动的图层,拖动 1.<span style='position:absolute;width:200;height:200;background:red' onmousedown=Mous ...

  10. 李洪强iOS开发之- 实现简单的弹窗

     李洪强iOS开发之- 实现简单的弹窗 实现的效果:  112222222222223333333333333333