2012-10-09 3 views
2

두 가지 다른 메소드간에 공유되는 객체의 배열을 갖고 싶습니다.다른 이벤트에서 동일한 객체에 액세스

내 웹 페이지에서 button1을위한 온 클릭은 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. 
    } 
}  
+2

나는 일반적으로 asp.net 및 웹에 대한 몇 가지 샘플 및 \ 또는 책을 읽고 함께 가야 좋을 것 ... 다음은 각 요청에 다시 생성됩니다 페이지 클래스를 가지고, 따라서 myObjects는 비어 있습니다. 각 버튼 클릭은 새로운 요청입니다. myObjects를 일부 저장소에 저장하고 (pageLoad 또는 유사한 이벤트에 복원) 클라이언트에 보내야하고 button2를 클릭 할 때 서버로 다시 보내야합니다. – Felix

답변

1

합니다 Peter Repac은 ViewState를 사용할 수도 있다고 말했습니다. 이처럼 :

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

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

성능에 영향을 미칠 수있는 크기를 viewstate가이 페이지를 전송으로 myObjects이 매우 커질 경우이를 사용하므로 복부 팽만주의하십시오. ViewState here에 대한 추가 정보

+0

세션에 저장되어 각 포스트 백에서 검색되어 성능에 영향을 미치지 않도록 할 수 있습니다. –

+0

사실, 세션이 InProc이고 응용 프로그램 풀이 재활용되면 데이터가 손실 될 수 있습니다. –

+0

네, 그게 또한 사실입니다. Viewstate가 손실되고 다른 Session 데이터도 손실됩니다. 자동 사용자 로그 오프가 발생할 가능성이 있으므로 손실 된 viewstate 데이터가 사소한 문제 일 수 있습니다. –

0

당신이 일단 당신이 세션 상태에있는 데이터 (또는 다른 수용 장소를) 다시 각 게시물에 데이터를 같은 방식으로로드, 또는 가능하게 저장 중 하나가 필요합니다 다른 후 백업에서 사용할 데이터를 원하는 경우 처음로드되었습니다.

당신은 세션 상태 here에 읽을 수 있습니다. 세션 상태를 사용할 때 발생할 수있는 함정을 읽으십시오.

코드는 다음과 같이 뭔가를 찾고 끝낼 수 :

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

그것은 언어의 문제가 아니에요. 그것은 웹 양식에 묶여 있습니다. 모든 웹 요청이 완료되면 웹 서버에서 모든 상태가 삭제됩니다. 그래서

: 웹 요청 일에 당신은 방법 항목을 호출하고 배열이 채워집니다.

웹 요청 1 완료된 html이 브라우저로 반환되고 서버의 배열이 삭제됩니다. 웹 요청에

2 방법 2 호출되지만, 배열은 광고

ObjectArray[] myObjects = new ObjectArray[100]; 

때문에 다른 데이터가 없음에 의해 초기화된다.

당신은, "이전"myObjects 아베가 DB에, 제안 당신이 쿠키에, 뷰 상태에서, sessionState의에 예를 들어, 어딘가에 저장해야 가치에 도달 할 수 있도록 .... @으로

+0

나는 이것이 무슨 일이 일어나고 있는지 몰랐다. 고맙습니다. – Krondorian

0

가장 쉬운 방법은 배열을로드하는 방법을 만들고, 당신이 Button1을 누르면 당신은 또한 단추 2를 누를 때를 호출 할 때 호출하는 것입니다. 그러나 나중에 더 많은 물건을 다하겠습니다 조치 2 ...

방금 ​​내가 생각하지 않는 시작하는 경우에 그들이 어떤 나쁜 습관을 만들 수 있기 때문에 viewstate가 또는 세션 덤비는 시작하는 것이 좋습니다. 가장 쉬운 방법 인 IMHO는 배열을 두 번로드하는 것입니다.

다른 메소드를 만들지 않고 method2에서 method1을 호출 할 수도 있습니다.

+1

실제로는 상대적입니다. 어레이 생성은 성능을 저하시키는 요인이 될 수 있으므로 한 번 생성하면 성능이 훨씬 좋아질 수 있습니다. 그러나 이것이 반드시 그런 것은 아닙니다. 나는 단지 유효 지점을 만들고있다. –

+0

나는 알고있다. 그러나 나는 asp.net 초심자들과 함께 일해 왔으며, 그들이 준비 할 때까지는 그들이 가르 칠 수있는 최악의 경우가있다. :-) – H27studio

+0

확실히 동의합니다. 초보자도 이런 종류의 개념을 오용하고있는 것을 보았습니다. 왜냐하면 대부분의 경우 각 개념을 완전히 이해하지 못하고 각각의 개념을 사용할 때가 많기 때문입니다. 그러나 경험은 아마도 그들이 가질 수있는 최고의 교사였습니다. –

관련 문제