2009-06-01 1 views
0

ASP.NET 페이지의 멤버 변수는 페이지를 새로 고칠 때마다 범위를 잃어 버릴 수 있습니다.누군가이 흥미로운 ASP.NET HTTP 파이프 라인 이벤트 동작을 설명 할 수 있습니까?

내가 편집 기능을 "경고"의 그리드를 표시하려면 다음 코드를 :

public partial class Alerts : System.Web.UI.Page 
{ 
    private _WikiSyntaxEngine; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     _WikiSyntaxEngine = new WikiSyntaxEngine(); 
    } 

    protected void gvAlerts_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     var alert = (DataModel.Alert)(e.Row.DataItem); 
     // Below is the only line of interest, because only when published 
     // to the server would it throw an exception... 
     string html = _WikiSyntaxEngine.ConvertWikiTextToHTML(alert.Description); 
    } 
} 

그것은 단지이 코드가 실패했던 출판하는 개발 서버에 있던 (예는 NullReferenceException_WikiSyntaxEngine 때문에가 발생합니다 그 행에 대한 갱신 중에는 null이었습니다.

그러나 로컬 컴퓨터에서 코드가 올바르게 실행됩니다. 행이 업데이트되고 그리드가 예상대로 새로 고쳐집니다.

이후로 나는 WikiSyntaxEngine을 싱글 톤으로 만드는 코드를 수정했거나 사용 된 모든 곳에서 인스턴스화 할 필요가 없으므로 처음부터 디자인 된 방식이어야합니다.

내 질문은 다음, 어떻게 Page_Load 이벤트 (예상대로) 내 로컬 컴퓨터에 gvAlerts_Databound() 전에 호출 할 수 있지만 _WikiSyntaxEngine에 대한 NullReferenceException의 결과로 개발 시스템에 호출되지?

답변

1

귀하의 gvAlerts GridView가 페이지의 ASP.NET 마크 업에 정의되어 있다고 가정합니다. 이 경우 OnInit() 이벤트에서 DataBound가되고 Page_Load()이 아닌 WikiSyntaxEngine이 인스턴스화됩니다.

Page_Load 전에 GridView가 바인딩되는 경우 WikiSyntaxEngine을 인스턴스화하려면 아마도 OnInit()을 사용해야합니다.

왜 개발과 제작에서 다른 행동을하고 있는지에 대해서는 여전히 나에게 수수께끼입니다.

관련 문제