C# 在不同事件中访问同一对象

C# 在不同事件中访问同一对象,c#,asp.net,C#,Asp.net,我想要一个在两个不同方法之间共享的对象数组 我的网页上的按钮1的onclick调用method1,它填充objectArray所需的值。我需要button2的onclick方法能够使用method1使用的相同数据访问相同的objectArray using myWebReference; { public partial class _Default : System.Web.UI.Page { ObjectArray[] myObjects = new ObjectAr

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

我的网页上的按钮1的onclick调用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.
    }
}       

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

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

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

myObjects = LoadMyObjects();
Session["objects"] = myObjects;

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

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

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

myObjects = LoadMyObjects();
Session["objects"] = myObjects;

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

因此: 在web请求1中,您调用method1并填充数组

web请求1完成的html返回到浏览器,服务器上的数组被销毁

在web请求上调用method2,但数组仅由行初始化

ObjectArray[] myObjects = new ObjectArray[100]; 
所以里面没有其他数据


如果您希望能够达到“以前的”MyObject值,您应该将其保存在某个位置,例如Abe建议的SessionState、DB、view状态、cookie等等。

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

因此: 在web请求1中,您调用method1并填充数组

web请求1完成的html返回到浏览器,服务器上的数组被销毁

在web请求上调用method2,但数组仅由行初始化

ObjectArray[] myObjects = new ObjectArray[100]; 
所以里面没有其他数据


如果您希望能够达到“以前的”MyObject值,您应该将其保存在某个位置,例如Abe建议的SessionState、DB、view state、cookie等等。

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

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

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

如果
myObjects
变得相当大,请小心使用此选项,因为ViewState随页面一起发送,因此其大小过大可能会影响性能。有关ViewState的更多信息。

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

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

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

如果
myObjects
变得相当大,请小心使用此选项,因为ViewState随页面一起发送,因此其大小过大可能会影响性能。有关ViewState的更多信息。

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

如果您刚刚开始,我认为开始处理viewstate或会话不是一个好主意,因为它们会造成一些坏习惯。IMHO中最简单的方法是加载数组两次


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

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

如果您刚刚开始,我认为开始处理viewstate或会话不是一个好主意,因为它们会造成一些坏习惯。IMHO中最简单的方法是加载数组两次


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

我建议您阅读一些关于asp.net和web的示例和/或书籍。。。在这里,您的页面类将在每次请求时重新创建,因此MyObject将为空。每次单击按钮都是一个新请求。您需要将MyObject保存到某些存储中(并在pageLoad或类似事件中还原),或将其发送到客户端,然后在单击按钮2时发送回服务器。我建议您继续阅读一些有关asp.net和web的示例和\或书籍。。。在这里,您的页面类将在每次请求时重新创建,因此MyObject将为空。每次单击按钮都是一个新请求。您需要将MyObject保存到某些存储中(并在pageLoad或类似事件中还原),或将其发送到客户端,然后在单击按钮2时发送回服务器。它可以存储在会话中,在每次回发时保存和检索,从而降低性能影响。没错,但是如果会话在进程中并且应用程序池回收,数据可能会丢失。是的,这也是事实。Viewstate将丢失,其他会话数据也将丢失。可能会导致用户自动注销,在那个阶段,丢失的viewstate数据将是一个小问题。我能够成功地实现ViewState。谢谢。它可以存储在会话中,并在每次回发时保存和检索,从而降低性能影响。这是事实,但如果会话在进程中且应用程序池回收,数据可能会丢失。是的,这也是事实。Viewstate将丢失,其他会话数据也将丢失。可能会导致用户自动注销,在那个阶段,丢失的viewstate数据将是一个小问题。我能够成功地实现ViewState。谢谢,这实际上是相对的。阵列创建可能是一个性能杀手,因此创建一次并保持它会更好。然而,情况未必如此。我只是提出了一个正确的观点。我知道,但我曾与一些asp.net初学者合作过,你能教给他们的最糟糕的事情就是在他们准备好之前的课程