2

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

我网页上 button1 的 onclick 调用方法 1,它填充 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

4 回答 4

3

不是语言的问题。它绑定到网络表单。在每个 Web 请求完成后,Web 服务器上的所有状态都会被销毁。

所以:在网络请求 1 中,您调用 method1 并且您的数组已被填充。

Web 请求 1 完成的 html 返回到浏览器,服务器上的数组被破坏。

在 Web 请求 2 中调用方法 2,但数组仅由该行初始化

ObjectArray[] myObjects = new ObjectArray[100]; 

所以里面没有其他数据。

如果您希望能够达到“以前的” myObjects 值,您应该将其保存在某处,例如 Abe 建议的 SessionState 中、DB 中、视图状态中、cookie 中......

于 2012-10-09T23:49:16.513 回答
1

正如@Peter Repac 所说,您也可以使用 ViewState。像这样:

//In method1.
ViewState["MyObjectsKey"] = myObjects;
....

//In method2.
myObjects = ViewState["MyObjectsKey"];

如果变得非常大,请小心使用它myObjects,因为 ViewState 与页面一起发送,因此膨胀其大小可能会影响性能。更多关于 ViewState的信息在这里

于 2012-10-10T00:02:33.730 回答
0

最简单的方法是创建一个加载数组的方法,并在按下 button1 时调用它,并在按下 button2 时调用它。但是在 action2 上,你稍后会做更多的事情......

如果您刚刚开始,我认为开始弄乱视图状态或会话不是一个好主意,因为它们会养成一些坏习惯。恕我直言,最简单的方法是加载数组两次。

您甚至可以从 method2 调用 method1 而无需创建另一个方法。

于 2012-10-10T00:46:29.870 回答
0

如果您希望数据在不同的回发中可用,您将需要在每个回发上以相同的方式加载该数据,或者可能在第一次加载后将数据存储在会话状态(或其他可接受的位置)。

您可以在此处阅读会话状态。请务必阅读使用会话状态的潜在陷阱。

您的代码最终可能看起来像这样:

myObjects = LoadMyObjects();
Session["objects"] = myObjects;
于 2012-10-09T23:47:31.560 回答