`
wangdeshui
  • 浏览: 248238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在服务器端保存ViewState

    博客分类:
  • web
阅读更多

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;

                }

 

            }

        }

分享到:
评论
1 楼 jinweijie 2009-07-21  
你好,这个实现不错,但是在用了scriptmanager以后就不可以用cache作为viewstate的储存了,不知道有没有解决办法?谢谢!

相关推荐

    asp.net服务器端保存viewstate例子,html中不在有viewstate

    asp.net中html页面含有viewstate页面状态,说实话很难看,所以尝试把它保存在服务器端,只是一个思路例子,希望对大家有所帮助。

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

    而且服务器会在处理页面完毕后销毁页面对象。 应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。 一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象...

    asp.net开发问题300问源码

    38.如何启用和禁用ViewState保存状态信息的功能 39.如何应用IsPostBack控制页面的加载 41.如何使用Trace对象进行跟踪调试(页面级) 42.如何使用#Include语法将文件添加到页面 43.如何使用编程的方式处理异常信息 ...

    asp.net专家疑难解答200问源码

    22.如何实现从服务器端向页面动态添加javascript脚本-示例1 22.如何实现从服务器端向页面动态添加javascript脚本-示例2 24.如何处理多页面重定向到同一页面后的返回问题 25.如何用Response.Redirect方法传递汉字 ...

    asp.net专家疑难解答200问

    如何实现从服务器端向页面动态添加javascript脚本-示例1 22.如何实现从服务器端向页面动态添加javascript脚本-示例2 24.如何处理多页面重定向到同一页面后的返回问题 25.如何用Response.Redirect方法...

    ExtAspNet_v2.3.2_dll

    -修正TreeNode的属性NavigateUrl不接受服务器端URL(以~/开头)的BUG。 -增加Accordion和Tree配合使用的示例(other\accordion_tree_run.aspx)。 -修正Panel图标不能显示的BUG(CSS中class名不能有$字符)。 +去除...

    WEB安全测试

    目录 序 1 前言 3 第1章 绪论 13 ...12.14 以交互方式尝试服务器端包含(SSI)注入 275 12.15 系统地尝试服务器端包含(SSI)注入 276 12.16 以交互方式尝试LDAP注入 278 12.17 以交互方式尝试日志注入 280

    asp.net教学讲义

    1.1.4 客户端代码与服务器端代码 8 1.1.5 ASP.NET简介 8 1.2 Web 窗体与ASP.NET页面 8 1.2.1 简介 8 1.2.2 ASP.NET应用程序的创建方法 9 1.2.3 Web窗体的特点 10 1.2.4 Web 窗体的功能 10 1.2.5 WEB窗体工作原理 11 ...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正TreeNode的属性NavigateUrl不接受服务器端URL(以~/开头)的BUG。 -增加Accordion和Tree配合使用的示例(other\accordion_tree_run.aspx)。 -修正Panel图标不能显示的BUG(CSS中class名不能有$字符)。 +去除...

    ASP.NET Night Words

    3.6 服务器端表单 28 3.7 html服务器控件 28 3.8 总结 31 第4章 visual studio 2008介绍 32 4.1 visual studio 2008网站 4.1 开发环境介绍 32 4.2 asp.net网站类型介绍 33 4.3 创建基于解决方案的asp.net ...

    asp.net知识库

    Server Side ViewState 在服务器端存贮ViewState (ASP.NET 2.0) VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP...

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

    [WEB安全测试].(美)霍普....12.14 以交互方式尝试服务器端包含(SSI)注入 275 12.15 系统地尝试服务器端包含(SSI)注入 276 12.16 以交互方式尝试LDAP注入 278 12.17 以交互方式尝试日志注入 280

    net学习笔记及其他代码应用

    答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。 24.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。 答:string str = null 是不给他分配...

    ASP.NET 控件的使用

    8.5.3 服务器端数据库与本地数据库 250 8.6 数据库驱动的Web应用程序示例 252 8.7 小结 253 第9章 使用SqlDataSource控件 254 9.1 创建数据库连接 255 9.1.1 连接到Microsoft SQL Server 255 9.1.2 连接到其他...

    ASP.NET2.0高级编程(第4版)1/6

    2.8.4 保存和导入  Visual Studio设置32 2.8.5 验证HTML34 2.8.6 团队的合作36 2.8.7 使用代码片断36 2.9 小结38 第3章 应用程序和页面框架39 3.1 应用程序的位置选项39 3.1.1 内置的Web服务器39 3.1.2 IIS40 3.1.3...

    ASP.NET.4揭秘

    8.5.3 服务器端数据库与本地数据库282 8.6 数据库驱动的web应用程序示例284 8.7 小结287 第9章 使用sqldatasource控件288 9.1 创建数据库连接289 9.1.1 连接到microsoft sql server289 9.1.2 连接到其他数据库292 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    7.2 客户端和服务器端的验证 194 7.3 ASP.NET验证服务器控件 195 7.3.1 验证原因 196 7.3.2 RequiredFieldValidator服务器控件 196 7.3.3 CompareValidator服务器控件 201 7.3.4 RangeValidator服务器控件 204 ...

    C#编程经验技巧宝典

    79 &lt;br&gt;0115 如何判断是否为数字 79 &lt;br&gt;0116 如何在字符串中查找指定字符 79 &lt;br&gt;0117 如何在字符串中用一子串替换另一子串 80 &lt;br&gt;0118 将新字符串添加到已有字符串中 80 &lt;br&gt;0119 如何在...

Global site tag (gtag.js) - Google Analytics