2011-03-24 6 views
3

필자는 기본 ASP.NET 웹 응용 프로그램 템플릿을 주위에 연주하고 다음 코드는 예외가 발생합니다 :의 인스턴스로 설정되지 않았습니다ASP.NET/C는 # 혼란

Object 참조 목적.

생성 된 버튼을 클릭하면.

누구든지 기술적 인 설명을 제공 할 수 있습니까?

참고 1 : 마크 업은 그 안에 자리 표시자가있는 빈 페이지입니다 (아래 참조).

참고 2 : LinkButtonButton으로 바꾸고 코드가 예외를 throw하지 않고 작동합니다.

public partial class test : System.Web.UI.Page 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     foo(); 
    } 
    protected override void OnLoad(EventArgs e) 
    { 
     foo(); 
    } 
    protected void foo() 
    { 
     placeholder1.Controls.Clear(); 
     placeholder1.Controls.Add(new Button() { Text = "test", ID = "btn" }); 
    } 
} 

마크 업 :

PLACEHOLDER1 또는 placeholder1.Controls 중 하나가 null처럼 보이는
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="WebApplication1.test" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:PlaceHolder runat="server" ID="placeholder1" /> 
    </div> 
    </form> 
</body> 
</html> 
+4

예외는 무엇입니까? – Brandon

+0

개체 참조가 개체의 인스턴스로 설정되지 않았습니다. – maxp

+1

던져진 예외는 무엇입니까? – Oded

답변

0

. 이것은 코드 예제에서 NullReferenceException에 대한 유일한 설명입니다.

0

포스트 백에서 돌아 오면 버튼이 null 인 것 같습니다. 기본적으로 Button을 제거하고 관련 이벤트를 제거 할 수있는 새 버튼을 만듭니다.

단지 내가이 시도 내 thoery 지원 :

protected override void OnInit(EventArgs e) 
{ 
    if (!IsPostBack) 
     foo(); 
} 
protected override void OnLoad(EventArgs e) 
{ 
    if (!IsPostBack) 
     foo(); 
} 
protected void foo() 
{ 
    placeholder1.Controls.Clear(); 
    placeholder1.Controls.Add(new Button() { Text = "test", ID = "btn" }); 
} 

을하고받은 오류가 발생하지 않았다.

런타임에 사용자가 버튼을 추가하려는 이유가 무엇입니까?

+0

이벤트가 나지 않아서 포스트 백에 버튼이 없기 때문에 오류가 발생하지 않았습니다. 'IsPostBack'조건을 제거하면 문제가 발생합니다. – maxp

+0

맞아, 나는 당신의 코드를 시도하고 오류를 받았습니다. Init/Load에 동적으로 버튼을 생성하면 특정 요청에 대해서만 존재합니다.포스트 백 (back-back)이 발생하면 (즉, 버튼 클릭) 관련 버튼과 이벤트는 null입니다. 따라서 오브젝트 참조 예외가 발생하고 있기 때문에 이전에 수행 한 상태로 존재해야합니다 다시 게시 –

+0

포스트 백은 수명주기의 일부입니다. http://msdn.microsoft.com/en-us/library/ms178472.aspx – maxp

0

OnLoad()에서 foo() 호출을 제거하면 코드가 작동하기 시작합니다.

이유는 페이지 수명주기의 이벤트 순서 때문입니다. 컨트롤에서 이벤트를 발생 시키려면 ProcessPostData(), RaiseChangedEvents() 및 RaisePostBackEvents() 이벤트가 발생하기 전에 컨트롤을 만들어야합니다 (페이지 수명주기의 그래픽 표현은 http://www.eggheadcafe.com/articles/o_aspNet_Page_LifeCycle.jpg 참조). 이러한 이벤트는 OnLoad()에서 OnLoad()를 시작하기 전에 OnLoad()에서 foo()를 호출하면 생성 된 인스턴스가 파기되므로 OnInit()에서 foo()를 호출하면 생성 된 인스턴스가 파기됩니다. 더 이상 존재하지 않는 컨트롤을 발생 시켰습니다. 따라서 "개체 참조가 인스턴스로 설정되지 않았습니다."라는 메시지가 나타납니다.