ASP.NET 웹 페이지에서 페이지 간 게시

업데이트: 2007년 11월

기본적으로 ASP.NET 웹 페이지에서 포스트백을 발생시키는 단추 컨트롤 및 기타 컨트롤에서는 페이지를 해당 페이지에 다시 제출합니다. 이 과정은 ASP.NET 웹 페이지의 표준 처리 과정 중 일부인 라운드트립 주기의 한 부분입니다. 자세한 내용은 ASP.NET 웹 페이지 소개를 참조하십시오.

경우에 따라 특정 페이지를 다른 페이지에 게시할 수도 있습니다. 예를 들어 각 페이지에서 다른 정보를 수집하는 다중 페이지 양식을 만들 수 있습니다. 이런 경우에는 다른 대상 페이지에 게시할 페이지에서 IButtonControl 인터페이스를 구현하는 특정 컨트롤(예: Button 컨트롤)을 구성할 수 있습니다. 이를 페이지 간 게시라고 합니다. 페이지 간 게시를 사용하면 Transfer 메서드를 사용하여 다른 페이지로 리디렉션하는 경우보다 몇 가지 이점이 있습니다. 자세한 내용은 사용자를 다른 페이지로 리디렉션을 참조하십시오.

참고:

Wizard 컨트롤을 사용하여 다중 뷰 양식을 만들 수도 있습니다. 자세한 내용은 Wizard 웹 서버 컨트롤 개요를 참조하십시오.

페이지 간 게시는 개별 컨트롤에 대해 구성되므로 사용자가 클릭하는 단추에 따라 다른 페이지에 게시되는 페이지를 만들 수 있습니다.

소스 페이지에서 정보 가져오기

페이지 간 게시를 위해 페이지를 구성하는 경우 소스 페이지에서 정보를 가져올 수도 있습니다. 예를 들면 페이지에 있는 컨트롤의 정보, 즉 브라우저에서 게시하는 정보와 소스 페이지의 공용 속성 등을 가져올 수 있습니다.

컨트롤 값 가져오기

Page 클래스는 PreviousPage라는 속성을 노출합니다. 소스 페이지와 대상 페이지가 같은 ASP.NET 응용 프로그램에 있는 경우 대상 페이지의 PreviousPage 속성에는 소스 페이지에 대한 참조가 포함됩니다. 페이지 간 게시의 대상 페이지가 아니거나 두 페이지가 서로 다른 응용 프로그램에 있는 경우에는 PreviousPage 속성이 초기화되어 있지 않습니다. 기본적으로 PreviousPage 속성은 Page로 형식화됩니다.

참고:

소스 페이지와 대상 페이지가 서로 다른 응용 프로그램에 있으면 페이지에서 컨트롤의 값을 직접 가져올 수 없지만 Form 사전에서 게시된 데이터를 읽을 수 있습니다. 소스 페이지의 뷰 상태는 해시되어 있으므로 읽을 수 없습니다. 값을 소스 페이지에 저장하고 다른 응용 프로그램의 대상 페이지에서 이 값을 사용할 수 있게 하려면 소스 페이지의 숨김 필드 내에 문자열 형식으로 값을 저장하고 대상 페이지에서 Request.Form을 통해 값에 액세스하면 됩니다.

PreviousPage 속성의 참조를 사용하면 소스 페이지에서 컨트롤을 검색한 다음 값을 추출할 수 있습니다. 일반적으로 FindControl 메서드를 사용하여 이 작업을 수행합니다.

참고:

대상 페이지와 정보를 공유할 수 있는 소스 페이지를 만들기 위해 코딩하는 경우 대상 페이지에서 컨트롤 값을 사용할 수 있게 하려면 이러한 값을 공용 속성으로 노출하면 됩니다. 자세한 내용은 이 항목의 뒷부분에 나오는 소스 페이지에서 공용 속성 값 가져오기를 참조하십시오.

다음 코드 예제에서는 소스 페이지에 있는 TextBox1 컨트롤의 값을 가져올 수 있는 방법을 보여 줍니다.

If Not Page.PreviousPage Is Nothing Then
    Dim SourceTextBox As TextBox
    SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
        TextBox)
    If Not SourceTextBox Is Nothing Then
        Label1.Text = SourceTextBox.Text
    End If
End If
if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

FindControl 메서드는 현재 명명 컨테이너에서 컨트롤을 찾습니다. 찾고 있는 컨트롤이 다른 컨트롤 내에 있는 경우에는(일반적으로 템플릿 내부) 먼저 컨테이너에 대한 참조를 가져온 후 컨테이너를 검색하여 가져올 컨트롤을 찾아야 합니다. 다음 코드 예제에서는 소스 페이지에 Login 컨트롤이 포함되어 있고 이 컨트롤에는 UserName이라는 TextBox 컨트롤이 포함된 LayoutTemplate 컨테이너가 있습니다. 이 코드는 UserName 컨트롤의 값을 가져옵니다.

Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

소스 페이지에서 공용 속성 값 가져오기

페이지 간 게시의 대상 페이지에서는 소스 페이지에 있는 공용 멤버의 값도 가져올 수 있습니다. 소스 페이지에서 공용 속성을 정의하고 대상 페이지에서 이 속성의 값을 가져오는 시나리오가 가장 일반적입니다.

보안 정보:

악의적인 사용자가 이용할 수 있는 정보의 양을 줄이기 위해 필요한 정보만 공용 속성으로 노출하는 것이 좋습니다.

소스 페이지의 공용 멤버를 가져오려면 먼저 소스 페이지에 대한 강력한 형식의 참조를 가져와야 합니다.

이 작업은 여러 가지 방법으로 수행할 수 있습니다. 첫 번째 방법에서는 다음 예제와 같이 소스 페이지를 지정하는 데 사용할 수 있는 @ PreviousPageType 지시문을 대상 페이지에 포함합니다.

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 

이 지시문이 포함되면 PreviousPage 속성은 참조되는 소스 페이지의 클래스로 강력하게 형식화됩니다. 따라서 소스 페이지의 공용 멤버를 직접 참조할 수 있습니다. 소스 페이지의 형식은 type 특성을 사용하여 직접적으로 지정하거나 위의 예제와 같이 VirtualPath 특성을 사용하여 소스 페이지를 명시적으로 참조하는 간적접인 방식으로 지정할 수 있습니다.

다음 코드 예제에서는 textCity라는 TextBox 컨트롤의 값을 노출하는 공용 속성 CurrentCity가 포함된 소스 페이지의 일부를 보여 줍니다.

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
참고:

소스 페이지에서 주로 페이지 간 게시용 값을 노출하기 위해 만드는 속성은 대개 읽기 전용 속성입니다. 소스 페이지에 공용 읽기/쓰기 속성이 포함될 수 있지만 일반적으로 대상 페이지 속성에서 소스 페이지 속성을 설정하면 값이 지속되지 않으므로 의미가 없습니다.

대상 페이지에 소스 페이지를 가리키는 PreviousPageType 지시문이 포함된 경우에는 다음과 같은 코드를 사용하여 소스 페이지의 CurrentCity 속성에 액세스할 수 있습니다.

Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

페이지에서 사용할 형식을 참조할 때와 마찬가지로 소스 페이지를 참조하는 @ Reference 지시문을 대상 페이지에 포함하는 방법으로 소스 페이지에 대한 강력한 형식의 참조를 가져올 수도 있습니다. 이런 경우에는 대상 페이지에서 페이지의 PreviousPage 속성을 가져온 후 다음 코드 예제와 같이 소스 페이지 형식으로 캐스팅할 수 있습니다.

Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

대상 페이지에서 포스트백 검사

페이지 간 포스트백을 수행하는 동안 소스 페이지 컨트롤의 내용이 대상 페이지에 게시되고 브라우저에서 HTTP POST 작업(GET 작업 아님)을 실행합니다. 그러나 대상 페이지에서는 페이지 간 게시를 수행한 후 바로 IsPostBack 속성이 false가 됩니다. POST 동작이지만 대상 페이지의 관점에서 동시 게시는 포스트백 동작이 아닙니다. 따라서 IsPostBack이 false로 설정되고 대상 페이지에서는 첫 번째 코드를 실행할 수 있습니다.

응용 프로그램에서 필요한 경우 페이지 간 게시의 결과로 대상 페이지가 실행되고 있는지 여부를 확인할 수 있습니다. 이렇게 하려면 다음 코드 예제와 같이 대상 페이지의 PreviousPage 속성에서 반환된 페이지 참조의 IsCrossPagePostBack 속성을 테스트합니다.

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

현재 페이지가 페이지 간 게시의 대상이 아닌 경우에는 PreviousPage 속성에서 null(Visual Basic에서는 Nothing)을 반환합니다.

자세한 내용은 방법: ASP.NET 웹 페이지 호출 방식 확인을 참조하십시오.

페이지 간 게시와 Server.Transfer 비교

PreviousPage 속성과 PreviousPageType 지시문은 대상 페이지를 호출하는 두 가지 경우, 즉 페이지 간 포스트백을 수행하는 경우(클라이언트 기반 전송)와 Transfer 메서드를 사용하는 경우(서버 기반 작업)에 유용합니다. 두 작업 모두 대상 페이지의 코드에서는 PreviousPage 속성을 사용하여 소스 페이지에 대한 참조를 가져올 수 있습니다.

대상 페이지가 페이지 간 게시를 통해 호출되었는지 아니면 Server.Transfer 작업을 통해 호출되었는지 확인하는 것이 중요할 수 있습니다. 이를 위해 Page 클래스는 IsCrossPagePostBack이라는 속성을 노출합니다. 자세한 내용은 방법: ASP.NET 웹 페이지 호출 방식 확인을 참조하십시오.

참고 항목

작업

방법: ASP.NET 웹 페이지를 다른 페이지에 게시

방법: ASP.NET 웹 페이지 호출 방식 확인