2009-07-23 3 views
0

페이지 정보를 저장하는 데이터베이스와 빌드 페이지의 .NET (C#)을 사용하여 동적으로 페이지를 작성합니다. 이 프로세스의 일부는 데이터베이스에있는 내용을 기반으로 (코드 숨김) 마스터 페이지를 설정하는 것이며, 이해할 수있는대로이 작업을 Page_PreInit에서 수행해야합니다.Page_PreInit과 Page_Load 사이의 객체/변수 전달

내 문제는 객체와 변수를 Page_PreInit에서 Page_Load으로 전달하는 방법입니다. 나는 페이지를 컴파일하려면 Visual Studio를 사용하지하고있어, 여러 가지 이유로

public partial class BuildPage : System.Web.UI.Page 
{ 
    protected static string pageData; 

    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     --- SET pageData = DATA FROM DATABASE, AND SET MASTERPAGE --- 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     --- USE pageData TO BUILD AND DISPLAY THE REST OF THE PAGE --- 
    } 
} 

:

나는 다음과 같이 작동하게 할 수 있었다, 그러나이 방법을 사용하면 임의 컴파일 오류를 데 첫 번째 페이지 요청시 즉시 .NET 컴파일을 수행 할 수 있습니다. 나는이 오류 메시지를 입수했습니다 :

2) "ASPNET는"이미 'pageData'에 대한 정의가 포함 된 형식 'BuildPage'CS0102 "

1)

확인을하는이 코드 파일 경기에서 정의 된 클래스 'inherits'속성을 사용하고 올바른 기본 클래스 (예 : Page 또는 UserControl)를 확장합니다. "

이상한 점은 첫 번째 웹 요청에서 페이지가 컴파일되는 경우가 있다는 것입니다. 그리고, 첫 번째 요청시에는 무작위로 페이지를 새로 고친 후 완벽하게 컴파일됩니다. 컴파일 된 후에는 코드를 다시 변경하고 다시 컴파일해야만 정상적으로 작동하는 것처럼 보입니다.

해당 메서드를 사용하여 Page_PreInitPage_Load 사이의 변수를 공유 할 때만 컴파일 오류가 발생하는 것으로 보입니다. 다시 말해, 단순히 데이터베이스에서 두 번 데이터를 요청하면 'Page_PreInit'에 한 번, 'Page_Load'에 한 번만 오류가 발생합니다. 하지만 실제로 데이터베이스 부하를 두 배로 늘리지는 않을 것입니다.

내 질문에는 실제로 두 부분이 있습니다. 먼저 변수를 공유 할 수있는 방법이 있습니까? Page_PreInit에서 Page_Load으로 데이터를 전달하는 더 좋은 방법은 무엇입니까?

둘째, 허용되는 방식 인 경우 오류가 관련이 없으며 이전에 반복 된 웹 요청을받은 후에 비슷한 오류가 발생하는 사람이 있습니까?

도움 주셔서 감사합니다. 사료

+0

항상 동일한 데이터로 테스트 중이십니까? 나는. 그것은 때로는 pageData가 데이터베이스에 누락 되었기 때문에 PageLoad에서 액세스하려고 할 때 pageData가 null 일 수 있습니까? – Don

+0

도움을 주신 모든 분들께 고맙게 생각하고 있습니다. 문제는 "정적"수정 자입니다. StackOverflow.Com은 놀라워요. –

답변

0

보호 된 (또는 개인적인) 멤버를 사용하는 것은 확실히 클래스의 메서드간에 개체를 공유하는 올바른 방법입니다. 그러나 회원은 이 아니며static이 아니어야합니다. Static은 여러 스레드에서 단일 인스턴스가 있음을 의미합니다. 해당 페이지에 액세스하는 서로 다른 요청에 대해 실행되는 페이지의 모든 사본은 해당 구성원을 읽고 쓰도록 경쟁합니다.

또한 클래스는 "부분"으로 표시됩니다. 즉, 다른 파일에 다른 클래스 단편이있을 수 있으며 이는 동일한 BuildPage 클래스에 대한 추가 구성원 및 메소드를가집니다. 둘 다에 동일한 pageData 멤버를 선언하면 충돌합니다.

+0

아, 고맙습니다. "정적"수정자가 정확하게 문제였습니다. "부분적인"클래스가 정확하다고 확신하지만 (http://msdn.microsoft.com/en-us/library/system.web.ui.page.aspx) 확실히 조사를 더 진행할 것입니다. 게다가. 신속하고 완전한 답변을 보내 주셔서 감사합니다. –

+0

@fodder great! 분명히하기 위해서 - "부분적인"것에는 반드시 틀린 것은 없습니다 - 뭔가가 "부분적인"것으로 표시 될 때 다른 곳에 중복되는 멤버 선언이있을 수 있다는 것을 명심해야합니다. –

0

대부분의 경우 멤버 변수가 정적 인 것은 원하지 않습니다. 두 명 이상의 사람이 동시에 페이지에 액세스하는 경우 이상한 결과가 발생할 수 있습니다.
템플릿이 작동하기 때문에 문제의 직접적인 원인이 될 수도 있습니다. 단언 할 수는 없지만.

0

코드 숨김에는 BuildPage로 지정된 클래스가있는 여러 페이지가 있습니까? 각 페이지마다 고유해야하며 관련 .aspx의 페이지 지시문에서 올바르게 참조되어야합니다. CS0102 오류는 동일한 이름을 가진 부분 클래스가 두 개 (둘 다 정적 값을 정의하기 때문)라고 생각합니다. 따라서 두 부분을 결합하면 결합 된 클래스에서 정적을 두 번 정의하려고합니다. 클래스 이름/페이지 지시문을 정렬하면 두 번째 오류도 해결됩니다.

두 번째로 pageData 변수가 정적 인 이유는 없습니다. 정적이 아닌 값을 설정하고 액세스 할 수 있습니다.

0

Static은 페이지의 모든 인스턴스에서 공유되므로 두 클라이언트가 같은 페이지를로드하는 경우 두 번째 클라이언트는 첫 번째 페이지를 덮어 쓰고 첫 번째 하중.

페이지에 대한 HttpContext를 사용하여 데이터를 전달할 수 있으며, 모든 이벤트가 진행됩니다.