看到在状态保持方面,尤其是需要在多页间进行状态保持的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
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