Resources : Programming ASP.NET(mspress), MSDN
이번 시간에 같이 다루어볼 내용은.... 어쩌면 말두 안돼!!!!하실지 모르는 주제
"한 페이지에 여러개의 웹폼 가능하다!!!" 에 대한 이야기입니다.
다시 말해서, 기존의 정설에 속하는, 하나의 웹 페이지는 오직 하나의 웹 폼만을 가질 수 있다 !! 는 이야기에 대한 정면으로 도전하는 반박의 글이 되겠다 이겁니다. 하하하!!!
근데, 진짜 그럴까요???? 에이~~~ 설마~~~~
사실 말입니다....
ASP.NET에서의 웹 페이지를 통상 웹 폼이라고 부르기에..
웹 페이지 = 웹 폼, 즉, page = form 이라고들 생각하시는 분들이 많은데요.
정확히 말하면, 웹폼도 Page 안에 들어있는 하나의 개체일 뿐입니다. 그러므로, 논리적으로 생각하면 하나의 웹 페이지에 하나 이상의 웹 폼이 들어가는 게 불가능하지는 않습니다. 논리적으로는 여러 개의 웹 폼을 aspx 페이지에 올려놓을 수가 있다는 것이지요. (과연 진짜일까요?? 믿거나 말거나~~)
그렇다면, 어디 한번 해보도록 하겠습니다. 이러한 실험정신!!! 멋지지 않습니까???
새로운 aspx 페이지를 하나 만들고(저는 MultiWebForms.aspx라고 만들어 보았습니다), 다음 처럼 코드를 작성해 보도록 하겠습니다. 가급적이면 VS.NET을 이용해서 작성해 주시면 감사하겠습니다. 하하
<%@ Page language="c#" Codebehind="MultiWebForms.aspx.cs" AutoEventWireup="false" Inherits="AspNetTest.MultiWebForms" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>MultiWebForms</title> <LINK href="css/main.css" type="text/css" rel="stylesheet"> </HEAD> <body MS_POSITIONING="FlowLayout"> <form id="MultiWebForms" method="post" runat="server"> <p> <asp:Label id="Label1" runat="server">저는 웹폼 남바원입니다.</asp:Label> </p> <p><asp:Button id="Button1" runat="server" Text="다음 >>"></asp:Button></p> </form>
<form id="WebForm2" method="post" runat="server"> <p> <asp:Label id="Label1" runat="server">저는 웹폼 남바투입니다.</asp:Label> </p> <asp:Button id="Button2" runat="server" Text="<< 이전"></asp:Button> </p> </form> </body> </HTML> |
자!! 준비가 되었다면, 이제 페이지를 한번 실행해 보도록 하겠습니다...!!!
기대되는 결과는???? 그리고, 나타난 결과는... 바로 그렇습니다.

실행 결과는 처참한 ERROR!!!!
페이지는 서버측 Form 태그를 하나만 포함할 수 있습니다.
아... 역시 그러했던 것입니다. ㅜㅜ
태오가 첨에 한 이야기와는 달리 역시나 하나의 웹 페이지에서는 오직 하나의 웹 폼만이 사용가능한 것이었습니다.!!!!
죄송합니다... 아무래도 제가 잘못 알았나 보네요.. ㅠ__ㅠ;;
이상으로 강좌를 마치겠습니다...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
라고 이 강좌가 끝나면.... 아마도 저는 사회적으로 매장당하지 않을까 싶습니다...
아아.. 여러분의 외침이 들려옵니다.
"그렇다면, 무슨 이야기가 남아있느냐?? 이미 한 페이지에는 오직 하나의 웹 폼만이 사용 가능하는 것을 눈으로 확인하지 않았느냐??? 보라~ 저 에러 메시지를~~~ 태오!! 아주 이제 거짓말 하는게 몸에 배어버렸구나... 페브리즈를 뿌리고 다시 오너라~"
하시는 듯 하군요...
하/지/만/!!!! 안타깝게도.. 거짓말이 아니었습니다.
실제로, 웹 페이지에서 다중 웹 폼의 사용이 가능합니다. 그렇다면, 이제부터 그것을 증명해 보도록 하겠습니다.
우선, 여러분이 aspx 페이지를 만들고, VS.NET에서 그것을 실행할 경우... 컴파일이 주루룩~ 이루어진 다음, 웹 브라우저가 뜨고... 에러 메시지가 나왔었다는 것을 기억하셔야 합니다. 이 부분이 매우 중요합니다. 즉, 컴파일 시에 에러가 난 것이 아니라, 런타임시에 에러가 났다는 사실 말입니다.
만일, 컴파일 시에 에러가 났다면, 브라우저는 뜨지도 않았을 것이고, VS.NET 하단에 어디서 컴파일 에러가 났는지 그 목록이 나타났을 겁니다. 근데, 그러한 것 없이 브라우저가 일단 떴다는 것은 컴파일은 문제없이 수행되었다는 것이지요.
고로, 일단 하나의 웹 페이지에 두 개의 웹 폼이 놓였다 할지라도 컴파일에는 전혀 문제가 없다는, 즉, 다중 웹 폼의 사용이 일단은 가능하다는 사실을 짐작하실 수 있을 것입니다.
문제의 발단은 런타임 시에 있기에, 이제 여러분은 다음과 같은 추측을 하실 수 있습니다.
"그렇다면, 런타임 시에만 하나의 웹 폼을 나타나게 하면 문제가 없다는 것일까???"
바로 그렇습니다. 그것이 정답인 것입니다.
하지만, 정답은 정답인데, 답만 알았다고 해서 모든게 해결되지 않는 것이 바로 프로그래밍이기에... 일단, 근본적인 이유를 먼저 파고들어 이해를 한 다음에, 실제로 그렇게 작성하여 이 문제를 해결해 보도록 하겠습니다.
어째서 다중 웹 폼들이 허용되지 않는지를 이해하기 위해서는 웹 페이지의 렌더링 과정을 살펴볼 필요가 있습니다. ASP.NET의 Page 클래스는 페이지의 생명주기 동안에 페이지가 가지고 있는 모든 컨트롤들에 대해서 각 컨트롤들의 RenderControl 메서드를 호출합니다. 이 메서드는 웹 폼안에 있는 모든 컨트롤들 각각이 자신의 코드를 실제로 서버의 메모리 상에서 작성되도록 하는 역할을 합니다. 이러한 컨트롤에는 웹 폼(HtmlForm) 컨트롤도 예외가 아니겠지요?
해서, 현재 웹 페이지에 존재하는 첫 번째 <form> 블럭은 성공적으로 처리되고 렌더되게 됩니다. 그 다음, Page 클래스는 하나의 폼 개체가 현재의 페이지에 대해서 처리되었다는 것을 기억하기 위해서 내부적인 어떤 플래그(flag)를 설정하게 됩니다.
그리고, 만일, 이후에 다른 <form> 블럭이 발견되면, 페이지는 먼저 이전에 <form> 블럭이 처리된 적이 있는 지를 확인하게 됩니다. 즉, 아까 말한 그 플래그를 검사한다는 것이지요. 해서, 만일, <form> 구역이 이전에 처리된 적이 있다면, 즉, 플래그가 이미 설정되어져 있다면, HttpException 예외가 던져지게 되는 것입니다.
이러한 이유로... 만일, 언제나 하나의 폼만이 런타임 시에 눈에 보이도록 구성한다면(하나의 웸 폼만이 렌더링 처리된다면), 웹 폼 페이지 안에서 여러분은 원하는 만큼의 서버측 웹 폼들을 가질 수가 있다는 것입니다. 실제로, 오직 하나의 웹 폼에 대해서만 visible 어트리뷰트를 true로 설정하고, 다른 모든 웹 폼들의 Visible 어트리뷰트는 false로 설정한다면 아무런 문제가 없다는 이야기이지요.
조금 이해가 되시나요???
그렇다면, 코드로써 한번 진행해 보도록 하겠습니다.
일단, 코드 비하인드 페이지로 이동하여, Page_Load 이벤트 처리기를 다음과 같이 작성해 보도록 하겠습니다. 이 코드는 현재 HTML 상에서 두번째 웹폼으로 놓여져 있는 녀석을 눈에 보이지 않도록 처리하는 코드입니다.
private void Page_Load(object sender, System.EventArgs e) { // 여기에 사용자 코드를 배치하여 페이지를 초기화합니다. HtmlForm wf2 = (HtmlForm)Page.FindControl("WebForm2"); wf2.Visible = false; } |
코드에서 수행하고 있는 작업은 매우 간단합니다. 현재 Page 에서 FindControl 메서드를 사용해서 두번째 웹폼에 대한 컨트롤 참조를 얻어낸 다음에요~ 그 웹 폼의 Visible를 false로 설정하여 눈에 보이지 않게 해버리는 것이지요~~
자. 이렇게 한 다음에는 어떤 결과가 나올지 궁금하지 않으십니까?? 그렇다면, 이제 컴파일하고 한번 실행해보도록 하죠~~

오오오옷~~~ 그렇습니다. 분명 페이지에는 두개의 웹 폼이 있었습니다만. 하나의 웹 폼을 눈에 안보이게 하니깐, 문제없이 웹 페이지가 실행되어 결과가 나타나고 있는 것입니다.
멋지지 않습니까?
그렇다면, 이제 각각의 웹 폼에 있는 버튼을 클릭했을 경우, 다른 웹 폼을 보여주도록 코드를 마저 꾸며보도록 하겠습니다. 즉, 첫번째 웹 폼에 있는 "다음 >>" 이라는 버튼을 클릭하면, 두번째 웹 폼을 나타나게 하구요. 두번째 웹 폼에 있는 "<< 이전" 이라는 버튼을 누르면, 첫번째 웹 폼이 나타나도록 만들어 보겠다는 것이지요. 코드는 어려울 것이 없습니다. 다음과 같지요~
private void Button1_Click(object sender, System.EventArgs e) { HtmlForm wf1 = (HtmlForm)Page.FindControl("MultiWebForms"); wf1.Visible = false;
HtmlForm wf2 = (HtmlForm)Page.FindControl("WebForm2"); wf2.Visible = true; }
private void Button2_Click(object sender, System.EventArgs e) { HtmlForm wf1 = (HtmlForm)Page.FindControl("MultiWebForms"); wf1.Visible = true;
HtmlForm wf2 = (HtmlForm)Page.FindControl("WebForm2"); wf2.Visible = false; } |
자.... 이제 페이지를 다시 실행해 볼까요? 우리의 기대대로 페이지는 각각 웹폼을 바꾸어 가면서 나타내고 있는 것을 보실 수 있을 것입니다. ^^ 잼나지 않나요?


하지만................
그렇다고, 이 방법이 현업에서 정말로 널리 사용될만한 방법이냐??? 하면, 사실 그것은 아닙니다. 이것은 특별한 상황에만 사용될 수 있는 일종의 편법(??)인 것이니까요..
하나의 페이지에 두개 이상의 웹폼을 올려놓고 사용하게 되면, 아무래도 페이지의 구성이나 사용방법이 복잡해지는 것이 사실입니다. 그리고, 이러한 방식은 ASP.NET 프로그래밍 방식에 그다지 맞는 방법도 아니지요. 해서, 이는 특별한 상황(!!, 그러한 상황이 언제일지는 여러분이 찾아보셔야 할 것입니다)에만 사용해 볼 수 있는 유용한 팁인 것입니다.
해서, 이번 강좌가 팁인 것이지요~~~
하하하...
좋은 하루 되세요~~~