现在的位置: 首页 > 综合 > 正文

关于Alex 的 ProcessContext

2011年05月29日 ⁄ 综合 ⁄ 共 5400字 ⁄ 字号 评论关闭

看到在状态保持方面,尤其是需要在多页间进行状态保持的Stage,多了一种比较好的选择,特别是在创建Wizard Style WebApplication的时候

原文地址: http://www.codeproject.com/aspnet/ProcessContext.asp

  1using System;

  2using System.Web;

  3using System.Web.UI;

  4using System.Collections;

  5
  6namespace Base4.Web.UI

  7{

  8    /// <summary>

  9    /// This class allows you to move data around (without using a database) between Postbacks and Redirects

 10    /// that are part of the same process and working with the same data.

 11    /// </summary>


 12    public class ProcessContext

 13    {

 14        public static ProcessContext Current

 15        {

 16            get

 17            {

 18                //The overhead of creating a ProcessContext is minimal since it is just a proxy to the real data

 19                //the reason we cache it in the HttpContext is that if we construct a new ProcessContext on each

 20                //Call to ProcessContext.Current then we call RegisterHiddenField more than once per request

 21                //which is dangerous as we may end up storing our data against the wrong ID!

 22                ProcessContext current = HttpContext.Current.Items["__PROCESSCONTEXT"as ProcessContext;

 23                if (current == null)

 24                {

 25                    current = new ProcessContext();

 26                    HttpContext.Current.Items["__PROCESSCONTEXT"= current;

 27                }


 28                return current;    

 29            }


 30        }


 31        public static string CurrentProcessID

 32        {

 33            get

 34            {

 35                return Current.ProcessID;

 36            }


 37        }


 38        protected string _processID = null;

 39        protected Hashtable _items = null;

 40
 41        /// <summary>

 42        /// When the ProcessContext is constructed so postbacks function okay without a QUERYSTRING

 43        /// redirect this Registers a Hidden Field to store the ProcessID in the form.

 44        /// </summary>


 45        protected ProcessContext()

 46        {

 47            (HttpContext.Current.Handler as Page).RegisterHiddenField("__PROCESSID",ProcessID);

 48        }


 49        /// <summary>

 50        /// Accesses the Hashtable associated with this ProcessContext.

 51        /// It creates a new Hashtable if not found. The Hashtable is stored in the users Session

 52        /// keyed on the ProcessContext.ProcessID

 53        /// </summary>


 54        public Hashtable Items

 55        {

 56            get

 57            {

 58                if (_items == null)

 59                {

 60                    _items = HttpContext.Current.Session[ProcessID] as Hashtable;

 61                    if (_items == null

 62                    {

 63                        _items = new Hashtable();

 64                        HttpContext.Current.Session[ProcessID] = _items;

 65                    }


 66                }


 67                return _items;

 68            }


 69        }


 70        /// <summary>

 71        /// Figures out what the ProcessID of the current ProcessContext is

 72        /// Checking in order -> QueryString, __PROCESSID field, or creating a new GUID

 73        /// </summary>


 74        public string ProcessID

 75        {

 76            get

 77            {

 78                if (_processID == null)

 79                {

 80                    _processID = HttpContext.Current.Request.QueryString["ProcessID"as string;

 81                    if (_processID == null)

 82                    {

 83                        _processID = HttpContext.Current.Request.Form["__PROCESSID"as string;

 84                        if (_processID == null)

 85                        {

 86                            _processID = Guid.NewGuid().ToString();

 87                        }


 88                    }


 89                }


 90                return _processID;

 91            }


 92        }


 93        /// <summary>

 94        /// Convenience access to this.Items[key] using this[key]

 95        /// </summary>


 96        public object this[object key]

 97        {

 98            get

 99            {

100                return Items[key];

101            }


102            set

103            {

104                Items[key] = value;

105            }


106        }


107        /// <summary>

108        /// Used to discard all data associated with this process

109        /// </summary>


110        public void Discard()

111        {

112            HttpContext.Current.Session.Remove(ProcessID);

113        }


114        /// <summary>

115        /// Used to empty the hashtable associated with this process

116        /// </summary>


117        public void Clear()

118        {

119            Items.Clear();

120        }


121        /// <summary>

122        /// Used to decorate a URL with the ProcessID so the ProcessContext

123        /// can be transfered to that URL

124        /// </summary>

125        /// <param name="url"></param>


126        public string AttachProcessToUrl(string url)

127        {

128            if (url.IndexOf("?"== -1

129                url = url + "?";

130            else

131                url = url + "&";

132            url += string.Format("ProcessID={0}",ProcessID);

133            return url;

134        }


135        /// <summary>

136        /// Used to redirect to the URL provided and transfer the ProcessContext

137        /// to that URL too.

138        /// </summary>

139        /// <param name="url"></param>

140        /// <param name="endRequest"></param>


141

抱歉!评论已关闭.