我想宣布一个Dictionary<string, object>
变量,但不知道在哪里/如何。字典中的值将是来自Page(ListBoxes,DropDownLists等)的对象,因此我无法在其他地方创建辅助类。有什么办法可以从代码隐藏中的每个方法访问这个变量吗?
答案 0 :(得分:9)
您可以在三个地方存储数据。在应用程序级别,它使所有会话都可以访问数据。会话级别,使数据可供该特定用户的所有页面使用。或者,在回发之间的页面级别,使其可用于当前页面。见下面的例子:
存储在应用程序级别 用于封装存储的示例类:
public static class ApplicationData
{
private static Dictionary<string, object> _someData = new Dictionary<string, object>();
public static Dictionary<string, object> SomeData
{
get
{
return _someData;
}
}
}
Usage Sample(在Page Load事件中): 这将增加所有会话的值。要试用它,请在您的计算机上打开两个浏览器并使用相同的URL。注意每个用户的请求如何递增值。
// Application Data Usage
if (ApplicationData.SomeData.ContainsKey("AppKey"))
{
ApplicationData.SomeData["AppKey"] = (int)ApplicationData.SomeData["AppKey"] + 1;
}
else
{
ApplicationData.SomeData["AppKey"] = 1;
}
Response.Write("App Data " + (int)ApplicationData.SomeData["AppKey"] + "<br />");
以会话级别存储: 用于封装存储的示例类:
public class SessionData
{
private Dictionary<string, object> _someData;
private SessionData()
{
_someData = new Dictionary<string, object>();
}
public static Dictionary<string, object> SomeData
{
get
{
SessionData sessionData = (SessionData)HttpContext.Current.Session["sessionData"];
if (sessionData == null)
{
sessionData = new SessionData();
HttpContext.Current.Session["sessionData"] = sessionData;
}
return sessionData._someData;
}
}
}
Usage Sample(在Page Load事件中): 为当前用户的会话增加值。当服务器上运行另一个会话时,它不会递增。
// Session Data Usage.
if (SessionData.SomeData.ContainsKey("SessionKey"))
{
SessionData.SomeData["SessionKey"] = (int)SessionData.SomeData["SessionKey"] + 1;
}
else
{
SessionData.SomeData["SessionKey"] = 1;
}
Response.Write("Session Data " + (int)SessionData.SomeData["SessionKey"] + "<br />");
页面级存储
在页面内:
private Dictionary<string, int> _someData;
private Dictionary<string, int> SomeData
{
get
{
if (_someData == null)
{
_someData = (Dictionary<string, int>)ViewState["someData"];
if (_someData == null)
{
_someData = new Dictionary<string, int>();
ViewState.Add("someData", _someData);
}
}
return _someData;
}
}
样本用法
页面加载处理程序中的
if (!this.IsPostBack)
{
incrementPageState();
Response.Write("Page Data " + SomeData["myKey"] + "<br />");
}
private void incrementPageState()
{
// Page Data Usage
if (SomeData.ContainsKey("myKey"))
{
SomeData["myKey"] = SomeData["myKey"] + 1;
}
else
{
SomeData["myKey"] = 1;
}
}
点击按钮:
protected void hello_Click(object sender, EventArgs e)
{
incrementPageState();
Response.Write("Page Data " + SomeData["myKey"] + "<br />");
}
请记住,ViewState在页面加载时没有反序列化,但是它会在Button.Click等事件处理程序中反序列化。
所有代码都经过测试,如果您想要完整的解决方案,请告诉我,我会通过电子邮件发送给您。
答案 1 :(得分:3)
在类中声明变量,但在任何方法之外。例如:
namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
private Dictionary<string, object> myDictionary;
protected void Page_Load(object sender, EventArgs e)
{
myDictionary = new Dictionary<string, object>();
myDictionary.Add("test", "Some Test String as Object");
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
myDictionary.Add("TextBox1Value", TextBox1.Text);
}
protected void Button1_Click(object sender, EventArgs e)
{
TextBox1.Text = myDictionary["test"].ToString();
}
}
}
答案 2 :(得分:3)
关于什么类型的数据,您要存储多长时间等多种选项,请查看Session State,ViewState,Application State
根据您的全局变量要求,我可以想到两种可能性。
使用静态类和静态变量,如下面的代码所示。
internal static class GlobalData
{
public static Dictionary<string, object> SomeData { get; set; }
}
现在使用它
//initialize it once in Application_Start or something.
GlobalData.SomeData = new Dictionary<string, object>();
//use it wherever you want.
object o = GlobalData.SomeData["abc"];
2使用Application
状态来存储您的全局数据。如下。
//Store it in application state
Application["YourObjectUniqueName"] = new Dictionary<string, object>();
//access it wherever using
Application["YourObjectUniqueName"]["abc"]
答案 3 :(得分:0)
您可以创建一个必须公开的类文件(例如general.cs),以便可以轻松访问它。在该类文件中,您可以定义此全局变量。
您可以从公共定义的任何其他页面或类访问此变量,并可以通过创建类的实例来利用此全局变量。
答案 4 :(得分:0)
您可以在类声明行之后的行上声明代码隐藏中的变量。如果您只想在一个页面上使用它,这将有效。