我想拥有一个在两种不同方法之间共享的对象数组。
我的网页上的onclick for button1调用method1,它填充了objectArray所需的值。我需要button2的onclick方法能够使用method1正在使用的相同数据访问同一个objectArray。
using myWebReference;
{
public partial class _Default : System.Web.UI.Page
{
ObjectArray[] myObjects = new ObjectArray[100];
public void Page_Load(object sender, EventArgs e)
{
//I have nothing in here at the moment
}
public void method1(object sender, EventArgs e)
{
//myObjects[]'s values are calculated and assigned here.
}
public void method2(object sender, EventArgs e)
{
String key = myObjects[0].value;
//when I try to get data within myObjects here, myObjects does exist,
//but it is empty and I get a null reference error when I try to use its values.
}
}
答案 0 :(得分:3)
这不是语言的问题。它绑定到Web表单。 每个Web请求完成后,Web服务器上的所有状态都将被销毁。
所以: 在Web请求1上,您调用method1并填充您的数组。
web request 1完成html返回浏览器,服务器上的数组被破坏。
在Web请求2上调用method2,但是数组仅由行
初始化ObjectArray[] myObjects = new ObjectArray[100];
所以没有其他数据。
如果你想能够达到“之前的”myObjects值,你应该把它保存在某个地方,例如在Abe建议的SessionState中,在DB中,在视图状态,在cookie中......
答案 1 :(得分:1)
正如@Peter Repac所说,你也可以使用ViewState。像这样:
//In method1.
ViewState["MyObjectsKey"] = myObjects;
....
//In method2.
myObjects = ViewState["MyObjectsKey"];
如果myObjects
变得非常大,请谨慎使用此功能,因为ViewState随页面一起发送,因此膨胀其大小可能会影响性能。有关ViewState here的更多信息。
答案 2 :(得分:0)
如果您希望在不同的帖子后面提供数据,您需要在每个帖子上以相同的方式加载该数据,或者可能在第一次加载后将数据存储在会话状态(或其他一些可接受的位置)
您可以阅读会话状态here。请务必阅读使用会话状态的潜在缺陷。
您的代码可能最终看起来像这样:
myObjects = LoadMyObjects();
Session["objects"] = myObjects;
答案 3 :(得分:0)
最简单的方法是创建一个加载数组的方法,并在按下button1时调用它,并在按下button2时调用它。但是在行动2中你会稍后做更多的事情......
如果你刚刚开始我不认为开始搞乱viewstate或者会话是一个好主意,因为他们可以创造一些坏习惯。最简单的IMHO方法是加载数组两次。
您甚至可以在不创建其他方法的情况下从method2调用method1。