Rob Howard
저는 어렸을 때 매년 몇 주 동안 친척들과 함께 시간을 보냈습니다. 미국의 어린 소년이었을 때 나는 네덜란드 전기 열차에 매료되었습니다. 이것은 내 고향인 텍사스 주 달라스에서는 한 번도 본 적이 없는 것이었습니다. 내 사촌들은 지나가는 기차를 보기 위해 나를 그들의 배에 태워 주었습니다. 선로에 가까운 물 위에 앉아 있으면 선로를 가로지르는 부드러운 휘파람 소리처럼 다가오는 기차의 소리를 들을 수 있으며, 기차가 지나갈 때 느린 클라이맥스를 재생합니다. ASP.NET 2.0을 생각하면 이 말이 생각나지 않을 수 없습니다. ASP.NET 2.0은 매우 가까워졌으며 우리 대부분은 출시가 계속해서 점점 더 커지고 있다는 "우" 소리를 들을 만큼 곧 출시되기를 간절히 기대하고 있습니다. 그러면 우리가 소프트웨어를 작성하는 방식이 다시 한 번 바뀔 것입니다.
Microsoft의 ASP.NET 2.0 목표는 개발자에게 50%의 성능을 제공하는 것입니다. 그러나 실제 성능 개선은 기대치를 뛰어 넘는 것으로 보인다. 새로운 개인화, 멤버십 및 역할 관리 기능은 개발자의 부담을 덜어주는 동시에 데이터 바인딩과 같은 다른 기능도 단순화되었습니다. 예를 들어 친숙하고 여전히 지원되는 구문은 다음과 같습니다.
<%# DataBinder.Eval (Container.DataItem, "FirstName") %>
ASP.NET 2.0에서는 다음과 같이 단순화할 수 있습니다:
<%# Eval("FirstName") %>
수많은 인상적인 새로운 기능이 있을 뿐만 아니라 의미 있는 서버 컨트롤도 많이 있습니다. ASP.NET 프로그래밍 모델은 <ASP:login> 컨트롤과 같은 서버 컨트롤과 새로운 데이터 소스 및 데이터 제어 서버 컨트롤과의 멤버십 통합으로 인해 ASP.NET 2.0에서 더욱 강력해졌습니다.
System.Web 클래스 라이브러리의 수는 ASP.NET 2.0에서 거의 두 배로 늘어났습니다. 이는 잡지 칼럼이 필요할 정도로 많은 내용을 다루고 있습니다. 이러한 변화의 범위를 진정으로 이해하려면 새로운 ASP.NET 2.0 책이 필요합니다. 저는 ASP.NET 2.0의 더욱 중요한 새 기능 중 일부를 강조하기 위해 여기에 몇 가지 칼럼을 작성할 계획입니다. 이번 달에는 탐색과 페이지 흐름에 중점을 두고 많은 관심을 받는 기능인 다른 페이지에 제출하는 기능부터 시작하겠습니다.
페이지 간 전달
ASP.NET으로 마이그레이션하는 개발자로부터 듣는 가장 큰 불만은 페이지 포스트백 모델입니다. ASP.NET 페이지는 단일 <form>을 가질 수 있고 HTTP 포스트백만 가능하므로 모든 처리가 모든 논리에서 실행됩니다. 이 페이지.
많은 개발자, 특히 ASP에 익숙하고 <form> 요소를 제어하려는 개발자는 ASP에서 콘텐츠 데이터(HTTP Post 또는 HTTP Get)를 제출할 위치와 방법을 <form>에 지시할 수 있다는 것과 같은 페이지 <양식>의 수량입니다. 그러나 ASP와 비교할 때 ASP.NET은 페이지에 <form runat=server>가 하나만 허용되며 페이지 자체에만 다시 게시될 수 있습니다. 이는 매우 실망스러울 수 있습니다. 다음은 ASP.NET 2.0의 다른 페이지로 전송되는 내용의 예입니다.
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="소스.aspx.cs"
상속="소스" %>
<ASP:컨텐트 ID="메인컨텐트"
ContentPlaceHolderID="메인" Runat="서버">
이름을 입력하세요:
<ASP:TextBox ID="NameBox" Runat="서버"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="서버" Text="제출" />
</ASP:컨텐츠>
마스터 페이지는 <ASP:content> 블록과 사용자 입력을 허용하는 일부 서버 컨트롤을 사용하여 페이지 레이아웃을 제어하는 데 사용됩니다.
콘텐츠를 다른 페이지로 전달하려는 경우 다음과 유사한 서버 코드를 사용할 수 있습니다.
Response.Redirect("Target.aspx?Name= " +
HttpUtility.UrlEncode(NameBox.Text));
이 기술의 문제점은 사용자가 제출 버튼을 클릭하면 서버가 요청을 수락하고 브라우저를 Target.aspx로 리디렉션하는 응답을 보낸다는 것입니다.
작업을 단순화할 수 있나요? ASP.NET 2.0에서는 대답이 '예'입니다. 다음으로 향상된 코드를 보여줍니다.
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="소스.aspx.cs"
상속="소스" %>
<ASP:컨텐트 ID="메인컨텐트"
ContentPlaceHolderID="메인" Runat="서버">
이름을 입력하세요:
<ASP:TextBox ID="NameBox" Runat="서버"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="서버" Text="제출"
PostBackUrl="~/Target.aspx" />
</ASP:컨텐츠>
<ASP:Button>의 PostBackUrl 특성에 유의하세요. 이 특성은 단추에 기본 포스트백을 수행하지 않고 Target.aspx에 직접 데이터를 제출하도록 지시합니다.
특히 ASP.NET ViewState에 익숙한 경우에는 이것이 어떻게 작동하는지 궁금할 수 있습니다. 물체. 그러나 이는 이 문서의 범위를 벗어납니다. 페이지 간 전달 기능을 사용하면 새로운 숨겨진 필드가 페이지에 추가됩니다.
<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE"
value="p1-dFHlCpgH2alr1vkr3G21UIR7jOuzn074led6lbGf1KQ47_F25GwG0" />
이는 컨트롤 트리에서 생성된 보기 상태와 약간 비슷하지만 페이지 간 전달을 위해 페이지의 유효성을 검사하는 보기 상태의 일부입니다. 페이지가 다른 페이지에 교차 게시되면 수신 페이지는 게시 페이지의 인스턴스에 액세스할 수 있어야 합니다. 이 경우 이는 Target.ASP가 Source.aspx의 세부 정보에 액세스할 수 있음을 의미합니다. 실제로 더 효율적인 접근 방식은 강력한 형식의 관리자를 통해 Source.aspx에서 Target.aspx로 API에 액세스하는 것입니다. 배달 페이지(이전 페이지)에 액세스하기 위해 ASP.NET2.0은 페이지 간 배달을 위한 페이지 특성인 PreviousPage를 제공합니다.
PreviousPage는 게재 페이지의 인스턴스를 반환하며, 페이지 간 게재 여부를 확인하는 데 사용되는 속성인 IsCrossPagePostBack도 있습니다. 이 속성은 기존 IsPostBack과 유사하지만 페이지 간 게시가 발생한 경우에만 true를 반환합니다.
PreviousPage 속성은 다르게 동작할 수 있습니다. 기본값은 단순히 이전 페이지의 인스턴스를 Page 유형으로 반환하지만 새 지시문을 사용하면 PreviousPage 속성이 페이지의 공개 멤버에 액세스하기 위해 강력한 형식의 인스턴스를 반환하도록 할 수 있습니다. 예를 들어 Target.aspx에 다음 코드를 추가합니다.
<%@ PreviousPageType VirtualPath="~/Source.aspx" %>
이제 Target.aspx의 PreviousPage 속성을 사용하여 Source.aspx의 데이터에 액세스할 수 있습니다. 그러나 Source.aspx의 NameBox와 같은 서버 컨트롤에 액세스하려면 다음 코드도 작성해야 합니다.
TextBox nameBox = PreviousPage.FindControl("NameBox") as TextBox
; 컨트롤 트리에 액세스합니다. 서버 컨트롤은 기본적으로 보호된 멤버 변수를 사용합니다. 이전 페이지의 요소에 간단하게 액세스하려면 Source.aspx의 속성이나 메서드를 공개로 노출해야 하며 그러면 다음 코드가 작동합니다. = PreviousPage.NameBox;
페이지 간 전달은 ASP.NET의 뛰어난 기능입니다. 페이지 간 전달의 작동 방식에 대해 자세히 설명하는 기사가 있습니다. MSDN Magazine Edge 칼럼 9월호에 Dino Esposito의 편집 내용이 실렸습니다(내 번역: ASP.NET 양식(번역) 참조). 또한 ASP.NET에 능숙하다면 대부분의 경우 표준 페이지 포스트백 모델을 계속 사용하게 될 것입니다. (번역자: 전문가라면 이 기능을 경멸할 것이라는 의미입니다.)
마법사 컨트롤은
페이지 간 전달을 통해 애플리케이션에 대한 복잡한 탐색 기능을 쉽게 구축할 수 있습니다. 그러나 이 기능을 사용하면 마법사 스타일 사용자 인터페이스를 더 쉽게 만들 수는 없습니다. 선형이든 비선형이든 마법사 스타일 사용자 인터페이스는 작업을 수행하도록 설계되는 경우가 많습니다. 이는 최종 사용자에게 복잡한 일련의 단계를 완료할 수 있는 사용자 친화적인 방법을 제공하며 각 단계는 여러 단위로 나뉩니다.
ASP.NET 1.x에서는 동일한 페이지에 여러 <ASP:panel> 서버 컨트롤을 배치하고 사용자 위치에 따라 표시 여부를 전환하는 등 몇 가지 트릭을 사용하여 마법사를 구현하는 경우가 많았습니다. ASP.NET에서 마법사를 작성하는 것은 쉬운 작업이 아니며 많은 디자이너가 마법사를 포기하고 단계 프로세스 관리도 혼란스럽습니다.
ASP.NET의 새로운 페이지 간 전달 기능을 사용하면 마법사 문제를 해결할 수 있지만 비선형 탐색이 필요한 경우에도 문제가 됩니다. 예를 들어 1단계, 2단계, 3-5단계 건너뛰기, 6단계, 3단계, 2단계, 6단계 등 ASP.NET 2.0 마법사 컨트롤은 이러한 문제의 대부분을 해결합니다. 또한 페이지 간 전달 마법사의 모든 입력 요소는 페이지 포스트백 모델을 통해 지속적으로 액세스할 수 있습니다.
마법사 컨트롤의 기능은 ASP.NET 1.1에서 패널을 숨기는 방식과 매우 유사합니다. 그러나 마법사 컨트롤은 여러 개의 하위 컨트롤을 포함할 수 있는 일련의 <ASP:WizardStep>을 노출합니다. 그러나 각 <ASP:WizardStep>에는 고유한 ID가 있어야 합니다. 그림 1을 참조하세요. 마법사 제어 페이지는 모든 탐색을 관리하고 선형 및 비선형 탐색을 지원하며 디자인 타임을 완벽하게 지원합니다. 그림 2는 마법사 컨트롤을 보여줍니다. 왼쪽은 링크 기반 비선형 탐색이고 오른쪽 하단은 선형 버튼 탐색입니다. 열리는 작업 메뉴에서는 일반적인 작업뿐만 아니라 디자인 타임에 단계 간 전환이 가능한 단계 목록도 볼 수 있습니다.
그림 2 Visual Studio의 마법사
마법사 컨트롤의 표시되는 모든 요소는 구성 가능합니다. 비선형 링크는 버튼이나 삭제 항목으로 대체될 수 있으며, 이전, 다음, 완료된 선형 탐색 요소도 그림 버튼이나 링크로 변경될 수 있습니다. 실제로 컨트롤의 모든 측면은 템플릿을 통해 구성할 수 있습니다.
ASP.NET 1.1에서 마법사 컨트롤을 작성할 때 어려운 점 중 하나는 사용자가 있어야 할 위치를 관리하는 것이었습니다. 마법사 컨트롤은 ActiveStep 속성을 노출하여 이 작업을 단순화합니다. ActiveStep 속성은 현재 활성화된 단계를 쿼리하고 확인할 수 있습니다. 마법사의 자연스러운 흐름은 구현에 의해 선언된 대로 진행되며 흐름은 MoveTo 메서드를 통해 언제든지 변경될 수 있습니다. MoveTo를 통해 모든 단계를 ActiveStep으로 설정할 수 있으며 탐색 및 처리를 지원하기 위해 여러 이벤트도 제공됩니다(그림 3 참조).
새로운 마법사 컨트롤은 사용자 정보를 수집할 때 매우 유용합니다. ASP.NET 1.1에서는 모든 기본 구조를 작성하지 않아도 됩니다. 마법사 컨트롤은 매우 유용하여 ast.net 팀은 이를 Membership 기능의 일부로 사용자를 생성하는 데 사용되는 CreateUserWizard 컨트롤의 기본 클래스로 사용합니다.
페이지 간 게시 및 <ASP:Wizard> 컨트롤
섹션은
ASP.NET 개발자에게 응용 프로그램의 탐색 흐름을 제어하기 위한 몇 가지 새로운 옵션을 제공합니다.페이지 간 전달은 현재 Response.Redirect 또는 Server.Transfer를 사용해야 하는 상황에서 유용합니다. 마법사 컨트롤은 선형 및 비선형 데이터 수집이 모두 필요한 복잡한 데이터 컬렉션을 구축하는 데 적합합니다.
------------------------------------- ------
그림 1 마법사 단계
<ASP:Wizard runat="server" >
<마법사 단계>
<ASP:마법사단계 ID="1단계">
환영!
</ASP:마법사단계>
<ASP:마법사단계 ID="2단계">
당신의 이름은 무엇입니까: [TextBox1]
[버튼1]
</ASP:마법사단계>
<ASP:마법사단계 ID="3단계">
[TextBox1.Text]님, 감사합니다!
</ASP:마법사단계>
</WizardSteps>
</ASP:마법사>
------------------------------- --- ----------
그림 3 탐색 이벤트
이벤트 | 설명 |
---|---|
ActiveStepChanged | ActiveStep이 새 WizardStep으로 설정되면 발생합니다. |
CancelButtonClick | 취소 버튼으로 식별된 버튼을 클릭하면 발생합니다. |
FinishButtonClick | 마침 버튼으로 식별된 버튼을 클릭하면 발생합니다. |
NextButtonClick | 다음으로 식별된 버튼이 클릭되면 발생합니다. 버튼이 클릭되었을 때 |
PreviousButtonClick | 이전 버튼으로 식별된 버튼이 클릭되었을 때 발생 |
SideBarButtonClick | 사이드바 링크나 버튼 중 하나가 클릭되었을 때 발생 |