`
wangdeshui
  • 浏览: 253385 次
  • 性别: 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中实现服务器端保存ViewState的例子,并探讨这样做的好处以及可能的实现方法。 首先,我们需要理解ViewState的工作原理。在ASP.NET中,当用户请求一个网页时,服务器会创建一个包含所有...

    viewstate 服务器端存储或者压缩

    在ASP.NET web应用程序中,`ViewState`是一种机制,用于在客户端和服务器端之间持久化页面控件的状态。它是一个加密的字符串,包含了页面在多个postback之间需要保持的数据。`ViewState`通常存储在HTML页面的隐藏...

    .NET客户端和服务器端保存状态的方法

    服务器端保存状态的方法适用于需要较高安全性和大量数据存储的场景,但可能会增加服务器负载。 选择合适的保存状态方法取决于应用场景,如数据量、安全性需求、资源利用和用户会话管理。开发者应根据具体需求平衡...

    理解ASP.NET的ViewState

    ViewState本质上是一个编码后的字符串,它由服务器端的.NET框架进行序列化和反序列化。开发者可以通过`.NET`框架提供的工具和方法来解析ViewState中的数据,例如使用`System.Web.UI.PageStatePersister`类。 #### ...

    ViewState解析工具源码

    在ASP.NET页面的生命周期中,ViewState在页面加载时保存控件的状态,并在回发时恢复这些状态,确保用户界面的一致性。 了解ViewState的工作原理对于任何ASP.NET开发者都至关重要。通过反编译这个工具的源码,我们...

    Asp.Net服务器端控件

    服务器端控件通过视图状态(ViewState)和隐藏字段自动处理状态管理,保存控件的属性值,以便在回发时恢复。 6. **控件生命周期** Asp.Net服务器端控件遵循一个详细的生命周期,包括初始化、加载、验证、呈现和...

    .net 中viewstate的原理和使用

    在.NET框架中,ViewState是一种用于维护客户端与服务器端之间往返交互状态的关键机制。通过在每个页面上添加一个隐藏字段_ViewState,它能够自动地保存并恢复页面上的控件状态。这种机制无需程序员额外编写代码来...

    ASP.NET服务器端控件介绍

    ASP.NET服务器端控件是.NET框架中Web Forms编程模型的核心组成部分,它们在服务器上执行,负责处理用户交互并生成HTML响应。以下是对这些知识点的详细解释: 1. **服务器控件简介**: ASP.NET服务器控件是运行在...

    viewstate实验

    ViewState是ASP.NET框架中的一个关键概念,它是一种服务器端状态管理机制,用于在用户与Web应用程序交互时保持页面控件的状态。在Web应用中,由于HTTP协议的无状态特性,每次请求都是独立的,无法自动保存之前请求的...

    .net ViewState解码器

    6. **性能考虑**:为了减少网络传输负载,可以考虑在服务器端手动设置`EnableViewState="false"`以关闭单个控件的ViewState,或者使用`ViewStateMode`属性来按需启用ViewState。 7. **跨站脚本攻击(XSS)**:虽然...

    ASP.NET ViewState 初探

    ViewState的工作原理相当简单:在服务器端,当ASP.NET页面执行时,页面上所有控件的状态(比如Label控件的文本)会被序列化成一个加密的字符串,然后放入一个隐藏的HTML表单字段中。这个隐藏字段随着页面一起发送到...

    ViewState 查看工具

    当用户与网页交互时,如点击按钮或者输入数据,这些变化可以通过ViewState在服务器端保持。 "ViewState 查看工具"是为了帮助开发者更好地理解和调试ASP.NET应用程序中的ViewState机制而设计的。这个工具能够解析并...

    Session,ViewState用法

    **Session** 是一种服务器端的技术,它允许应用程序在用户会话期间存储数据。当用户访问网站时,服务器为该用户创建一个唯一的Session对象,并为其分配一个Session ID。此ID通常作为Cookie存储在客户端浏览器中,...

    viewstate用法

    它是一个关键特性,允许服务器端控件保留其属性和数据,即使在用户与页面交互并导致页面重新加载时也是如此。然而,如果不正确或不谨慎地使用`ViewState`,可能会对应用程序产生负面影响,包括数据泄漏、安全性问题...

    ViewState 代码查看器

    它是一个服务器端的机制,允许Web表单在多个HTTP请求之间保持数据,而无需在客户端存储或重新发送这些数据。`ViewState 代码查看器`工具正是针对这种技术而设计的,帮助开发者更直观地理解和调试ViewState的工作原理...

    ASP.NET ViewState

    ASP.NET ViewState是一个重要的概念,它是ASP.NET框架为了保持页面在客户端和服务器端之间交互时的状态而引入的一种机制。状态管理是Web开发中的一个关键问题,因为HTTP协议本身是无状态的,每次请求都是独立的。...

    ASP.NET保存信息总结(Application,Session,Cookie,ViewState和Cache等)

    Cache 对象的保存位置是在服务器端。 隐藏域 隐藏域用于保存小量、简单的数据,生命周期是一个 Web 页面的生命期。隐藏域的保存位置是在客户端。 查询字符串 查询字符串用于保存小量、简单的数据,生命周期是...

    winform ViewState的功能

    在WinForms中,控件的状态通常通过控件的属性来维护,而不是像Web开发中的ViewState那样存储在服务器端的隐藏字段中。 在ASP.NET Web开发中,ViewState用于在页面的生命周期中持久化控件的状态,确保在回发时控件能...

    viewstate压缩算法源码

    1. **压缩过程**:在服务器端,当一个页面的状态被序列化到ViewState时,可以使用一种称为GZip或Deflate的压缩算法来减小其大小。这些压缩算法通过查找并替换重复的数据序列来实现压缩。在ASP.NET中,这个过程通常在...

Global site tag (gtag.js) - Google Analytics