

























1
using System;
2
using System.Web;
3
using System.Web.UI;
4
using System.Collections;
5
6
namespace 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
public void Redirect(string url, bool endRequest)
142
{
143
AttachProcessToUrl(url);
144
HttpContext.Current.Response.Redirect(url,endRequest);
145
}
146
}
147
}
148
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。