2007/02/28 21:55

얼마전 정식으로 나온ASP.NET AJAX 1.0를 사용하기 위해 개발전 몇가지 테스트를 수행하려 했다.

 

도구상자에서 ScriptManager 컨트롤을 드래그 하고 Page 상단에 넣은 다음, UpdatePanel 컨트롤을 하단에 드래그

 

그 Panel안에 AJAX를 이용하고 싶은 컨트롤을 올려 놓으면 끝이다...

 

정말 편리하다. AJAX의 작동원리나 기초 지식을 생각하지 못하게 하는 무서운 편리함이긴 하지만 개발 기간을

 

단축 시킬 수 있는 점은 무시 못할듯 하다.

 

그런데 ASP.NET으로 개발을 하다 보면 대부분 서버컨트롤을 동적으로 생성하게 된다.

 

이 동적으로 생성된 컨트롤은 AJAX의 도움을 받지 못하고 외롭게 혼자 PostBack을 일으킨다.

 

즉, AJAX가 적용이 안된 컨트롤 처럼 동작한다는 것인데...

 

그럼 그 컨트롤을 UpdatePanel에 넣으면 되지 않을까?? 당연한 발상이다.

 

언제나 그렇듯 바로 테스트를 해봐야 직성이 풀린다.

 

사용자 삽입 이미지

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

위처럼 새프로젝트를 선택하고 ASP.NET AJAX-Enabled Web Application을 선택한다.

 

혹... 나오지 않는다면 Visual Studio 2005 SP1과 ASP.NET AJAX 1.0 설치 여부를 확인해보세요.

 

사용자 삽입 이미지

생성된 프로젝트에 기본적으로 Defalut.aspx가 생기는데 그 페이지 디자인을

 

옆 그림처럼 드래그한다.

 

현재는 이벤트를 발생시킬만한 컨트롤이 없다.

 

그 이벤트를 발생시킬 Button 컨트롤을 생성하고 그 컨트롤을 UpdatePanel에

 

포함 시키는 코드를 cs파일에 작성해 보면...

 

오른쪽 마우스 -> 코드보기로 cs파일로 고고씽~해주삼~~

 

protectedvoidPage_Load(objectsender,EventArgse)

{

  Buttonbtn =newButton();

   btn.Text ="현재 시간을 보여줄래??";

   btn.Click +=newEventHandler(this.btn_Click);

   UpdatePanel1.ContentTemplateContainer.Controls.Add(btn);

}

 

privatevoidbtn_Click(objectsender,EventArgse)

{

   Label1.Text =DateTime.Now.ToString();

}

 

 

저렇게 작성하고 웹브라우져로 보면 정말 씸플하게 잘 작동한다.

 

좋았어..내가 필요한건 LinkButton이니까 그걸로 테스트를 해봐야지...

 

그래서 LinkButton을 생성하고 UpdatePanel에 추가해주었다.

 

당연한 결과를 바라면서 브라우져로 보니 뜨억~ PostBack이 되버린다.

 

아...당환스런 맘을 추스리고 하나씩 살펴보았다.

 

정말 원인을 알 수가 없었다. 그래서 디자인 페이지에서 LinkButton을 드래그해서 테스트해보니

 

뒷통수 맞은듯 아주 잘된다. 이런저런 삽질과 ASP.NET AJAX Document를 대략...1시간정도

 

살펴본 결과 원인은~!! 새로 생성된 컨트롤에 ID가 없었던 것...

 

ID가 없어도 잘 동작하는 Button은 HTML로 랜더링되면 type이 submit이니... 잘 될 수 있었지만

 

LinkButton은 a태그로 랜더링 된다. AJAX가 HTML태그에 고유한 ID가 없으면 지는 나몰라라...

 

하고 지켜만 보는 것 이다. ㅠ,ㅜ

 

protectedvoidPage_Load(objectsender,EventArgse)

{

  Buttonbtn =newButton();

   btn.Text ="현재 시간을 보여줄래??";

   btn.Click +=newEventHandler(this.btn_Click);

   UpdatePanel1.ContentTemplateContainer.Controls.Add(btn);

}

 

privatevoidbtn_Click(objectsender,EventArgse)

{

   Label1.Text =DateTime.Now.ToString();

}

 

ID를 부여하면 정말 원하는대로 잘 된다. 역시 기초 부족은 쓸데없는 삽질을 부르는 법인가 보다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by mari