2008-09-03 4 views
0

처음으로 페이지를로드 할 때 (! IsPostback) 코드에 버튼을 만들고 내 페이지에 추가 한 다음 click 이벤트에 이벤트 핸들러를 추가합니다.내 이벤트가 시작되지 않습니다.

그러나 페이지를 다시로드 한 후 버튼을 클릭하면 내 이벤트 핸들러가 실행되지 않습니다.

이유를 설명 할 수 있습니까?

답변

4

@ 브래드 : 당신의 대답은 완료되지 않고, 그는 Page_Load 이벤트 중에 페이지 라이프 사이클에서 너무 늦은 것 같습니다.

좋아, 다음은 누락 된 부분입니다.

ASP.NET은 상태 비 저장입니다. 즉, 페이지가 렌더링되어 브라우저로 전송 된 후 페이지 객체와 그 위에있는 모든 객체가 파괴됩니다. 해당 페이지와 사용자의 브라우저 사이에 서버에 남아있는 링크가 없습니다.

사용자가 단추를 클릭하면 해당 이벤트가 숨겨진 viewstate 필드와 같은 다른 정보와 함께 서버로 다시 전송됩니다.

서버 측에서는 ASP.NET이 요청을 처리하는 페이지를 결정하고 페이지를 처음부터 다시 작성합니다. 서버 컨트롤의 새로운 인스턴스는 .aspx 페이지에 따라 함께 만들어지고 연결됩니다. 다시 어셈블되면 포스트 백 데이터가 평가됩니다. viewstate는 컨트롤을 채우는 데 사용되며 이벤트는 시작됩니다.

이 모든 것은 특정 순서대로 발생합니다 (Page Lifecycle). 동적 컨트롤을 만들고 런타임에 웹 페이지에 추가하는 등 ASP.NET에서보다 복잡한 작업을 수행하려면 페이지 수명주기를 이해해야합니다.

문제가 있으면 페이지가로드 될 때마다 해당 버튼을 만들어야합니다. 또한 페이지에서 이벤트가 시작되기 전에 해당 단추를 만들어야합니다. 컨트롤 이벤트는 Page_Load와 Page_LoadComplete 사이에서 발생합니다.

ViewState 정보가 구문 분석되고 컨트롤에 추가되기 전에 컨트롤 이벤트가 발생하기 전에 컨트롤을로드해야하므로 PreInit 이벤트를 처리하고 그 시점에 단추를 추가해야합니다. 다시 말하지만, 페이지가로드 될 때마다이 작업을 수행해야합니다.

마지막주의 사항; 이벤트가 autowired되기 때문에 페이지 이벤트 처리는 ASP.NET에서 조금 이상합니다. Load 이벤트 핸들러는 Page_Load ...

이라고합니다.
2

포스트 백이 아닌 버튼을 항상 추가해야합니다.

0

발생하는 이벤트 바인딩이 HTML로 변환되어야하기 때문입니다. 이 포스트 백은 OnInit와 OnLoad 사이의 페이지에 바인딩 된 경우 발생합니다. 따라서 단추가 이벤트를 바인딩하도록하려면 반드시 OnInit에서 작업하십시오.

페이지 수명주기 설명을 참조하십시오. 당신이 모든 포스트 백 이벤트 처리기를 다시 연결하지 않는 경우

http://msdn.microsoft.com/en-us/library/ms178472.aspx

1

, 이벤트는 버튼이 존재하지 않습니다. 페이지가 새로 고침 될 때마다 이벤트 처리기가 첨부되어 있는지 확인해야합니다. 그래서, 여기에 귀하의 페이지에 대한 이벤트의 순서입니다 :

  1. 페이지 버튼 이벤트 핸들러가 다시 게시 포스트 백에
  2. 의 원인이
  3. 버튼을 클릭 부착되어 만들어집니다가, Page_Load 이벤트는 부착을 건너 뜁니다 ! 당신의 IsPostBack을 문이 시점에서
  4. 의 becaue 이벤트 핸들러의, 그래서 이벤트 발생하지 않습니다 클릭 버튼에 대한 이벤트 핸들러가없는
관련 문제