在不同的事件中访问同一个对象

时间:2012-10-09 23:41:49

标签: c# asp.net

我想拥有一个在两种不同方法之间共享的对象数组。

我的网页上的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.
    }
}       

4 个答案:

答案 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。