在服务器端保存ViewState

简介:

1.比较

Asp.net 的一个强大的功能就是ViewState,  但是这也成为很多人诟病的地方,我们先来看一个实例

ViewState其中一个特性就是保存页面的状态,下面我们看一个很简单的登录页面。

(1) 默认的页面存储

下面两幅图是使用默认的ViewState, Asp.net把状态保存在页面的一个Hidden控件里。每次请求时往返于客户端与服务器之间,我们可以看到储存了很多的值,页面大小是28.2K。

image

image

(2)自定义的Cache存储

下面两幅图是我们使用自定义的Cache存储,页面的大小是27.5K,虽然不到1K,但这个页面的结构比较简单,如果复杂的,如用了GridView等,这个差别还是比较大的

image

image

(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;

                }

 

            }

        }

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2008/11/20/1337781.html如需转载请自行联系原作者


王德水

相关文章
|
存储 JSON NoSQL
谁说Session只能存储在服务器端?
今天使用Koa遇到了一个诡异的问题,然后仔细研究了Koa-Session的实现原理,刷新了我的认知。好我们从头讲起。 先看看Session的原理是什么?
472 0
|
Web App开发 JavaScript 前端开发
前端接收数据流实现图片预览效果--ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
本文为转载文章 原文链接:https://www.cnblogs.com/cdemo/p/5225848.html 首先要谢谢这位大神的无私贡献!解决了我的问题也完美表达了我当时的心路历程 ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践 写在前面 :从提出需求到完美的解决问题,实现过程是曲折的。
8114 0
|
8月前
客户端禁用cookie后的会话数据保存问题
客户端禁用cookie后的会话数据保存问题
|
8月前
|
存储 JavaScript PHP
什么是cookie,如何设置在浏览器页面关闭后清除cookie
什么是cookie,如何设置在浏览器页面关闭后清除cookie
509 0
|
8月前
|
存储
HTTP是不保存状态的协议 如何保存用户状态
HTTP是不保存状态的协议 如何保存用户状态
|
数据采集 Python
使用urllib设置代理和传递/保存cookie
使用urllib设置代理和传递/保存cookie
116 0
|
前端开发 PHP 数据安全/隐私保护
浏览器同步发送请求之form表单提交数据
浏览器同步发送请求之form表单提交数据 上篇就文章我们讲到了同步和异步的区别,这次主要说一下在网页中如何提交同步的请求,答案就是通过form表单提交请求。 1.GET请求 HTML代码: &lt;form action=&quot;get.php&quot; method=&quot;get&quot;&gt; 账号:&lt;input type=&quot;text&quot; name=&quot;user&quot;&gt; &lt;br&gt; 密码:&lt;input type=&quot;text&quot; name=&quot;psw&quot;&gt;&lt;br&gt; &lt;input type=&quot;submit&quot; value=&quot;登录&quot;&gt; &lt;/form&gt; 1 2
IE5 ~IE8的浏览器是如何持久化数据的?
User Data: 是微软为IE专门在系统中开辟的一块存储空间,所以说只支持Windows+IE的组合,实际测试在2000(IE5.5)、XP(IE6、IE7),Vista(IE7)下都是可以正常使用的。在XP下,一般位于C:\Documents and Settings\用户名\UserData,有些时候会在C:\Documents and Settings\用户名\Application Data\Microsoft\Internet Explorer\UserData。
135 0
|
JSON 前端开发 JavaScript
EasyUI–表单加载内存/本地/服务端数据
在不使用前端语言JS(jQuery等前端框架本质上也是JS)时,如果我们想往表单里面放入数据,该怎么办?比如从文件中、从数据库查出用户信息显示在表单中。
527 0
EasyUI–表单加载内存/本地/服务端数据
|
前端开发