在伺服器端儲存ViewState

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   strong   io   

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;

                }

 

            }

        }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.