방법: ASP.NET 웹 페이지 간에 값 전달

보기 전환:
ScriptFree
.NET Framework 4 - ASP.NET
방법: ASP.NET 웹 페이지 간에 값 전달
이 문서는 수동으로 번역한 것입니다. 이 페이지와 원본 영어 콘텐츠를 동시에 보려면 보기 기본 설정을 단순 보기로 전환하십시오.

응용 프로그램이 ASP.NET의 특정 웹 페이지에서 다른 웹 페이지로 리디렉션(탐색)하는 경우 소스 페이지의 정보를 대상 페이지에 전달할 수 있습니다. 사용자가 구입할 품목을 선택할 수 있는 페이지를 예로 들 수 있습니다. 사용자가 페이지를 제출하면 이 사용자가 입력한 정보를 처리할 수 있는 다른 페이지를 호출할 수 있습니다.

이 항목에 수반되는 Visual Studio 웹 응용 프로그램 프로젝트 및 소스 코드를 다운로드하십시오.

참고참고

ASP.NET 웹 사이트의 한 페이지에서 다른 페이지로 이동하는 방법에 대한 자세한 내용은 방법: 사용자를 다른 페이지로 리디렉션을 참조하십시오.

여러 가지 방법을 사용하여 페이지 간에 정보를 전달할 수 있으며 이 중 일부는 리디렉션이 발생하는 방식에 따라 다릅니다. 다음 옵션은 소스 페이지가 대상 페이지와는 다른 ASP.NET 웹 응용 프로그램에 있거나 소스 페이지가 ASP.NET 웹 페이지가 아닌 경우에도 사용할 수 있습니다.

  • 쿼리 문자열 사용

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

다음 옵션은 소스 및 대상 페이지가 동일한 ASP.NET 웹 응용 프로그램에 있는 경우에만 사용할 수 있습니다.

  • 세션 상태 사용

  • 소스 페이지에 공용 속성을 만들고 대상 페이지의 속성 값에 액세스

  • 소스 페이지의 컨트롤에서 대상 페이지의 컨트롤 정보 가져오기

쿼리 문자열 사용

하이퍼링크나 Response.Redirect를 사용하여 한 페이지에서 다른 페이지로 이동할 경우 URL의 끝 부분에 쿼리 문자열의 정보를 추가할 수 있습니다.

참고 참고

쿼리 문자열을 사용하여 중요한 데이터를 전달하지 마십시오. 쿼리 문자열에 포함된 정보는 사용자가 볼 수 있고 쉽게 수정될 수 있으므로 보안 문제가 발생할 수 있습니다.

자세한 내용은 QueryString을 참조하십시오.

쿼리 문자열을 사용하여 정보를 전달하려면

  1. 소스 페이지에서 대상 페이지의 URL을 지정할 때 URL의 끝 부분에 키/값 쌍 형태로 전달할 정보를 포함합니다. 다음 예제와 같이 첫 번째 쌍 앞에는 물음표(?)가 오고 다음 쌍 앞에는 앰퍼샌드(&)가 옵니다.

    http://contoso.com/products.aspx?field1=value1
    http://contoso.com/products.aspx?field1=value1&field2=value2
    
  2. 대상 페이지에서 다음 예제와 같이 HttpRequest 개체의 QueryString 속성을 사용하여 쿼리 문자열 값에 액세스합니다.

    Visual Basic
    Dim s As String
    s = Request.QueryString("field1")
    

    C#
    String s = Request.QueryString["field1"];
    
소스 페이지에서 POST 정보 가져오기

소스 페이지에서 HTTP POST 작업을 사용하여 대상 페이지로 이동하는 경우 대상 페이지의 Form 컬렉션에서 게시된 값을 검색할 수 있습니다. 게시 값만 가져올 수 있으며 페이지에 있는 임의의 컨트롤에 대한 값은 읽을 수 없습니다.

다른 응용 프로그램의 소스 페이지에서 컨트롤 값을 가져오려면

  1. 소스 페이지에서 폼이 전송될 때 값을 게시하는 HTML 요소(예: input, textarea) 또는 ASP.NET 서버 컨트롤(예: TextBox, DropDownList 컨트롤)이 들어 있는 form 요소를 포함합니다.

  2. 대상 페이지에서 이름/값 쌍의 사전을 반환하는 Form 컬렉션을 읽습니다. 이때 각 이름/값 쌍은 게시된 값을 나타냅니다.

    다음 코드 예제에서는 소스 페이지에서 게시된 모든 컨트롤의 ID와 값을 표시하고 게시된 값을 Label1이라는 레이블에 표시합니다.

    참고 참고

    ASP.NET 웹 페이지의 게시 정보에는 __VIEWSTATE, __EVENTTARGET__EVENTARGUMENT 등과 같이 페이지에서 내부 처리에 사용되는 숨김 필드의 값이 포함됩니다. 다음 코드 예제에서는 선행 밑줄(__)을 사용하여 이름을 지정하는 게시된 필드의 값을 제외합니다.

    Visual Basic
    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles Me.Load
        Dim displayValues As New StringBuilder()
        Dim postedValues As NameValueCollection = Request.Form
        Dim nextKey As String
        For i As Integer = 0 To postedValues.AllKeys.Length - 1
            nextKey = postedValues.AllKeys(i)
            If nextKey.Substring(0, 2) <> "__" Then
                displayValues.Append("<br>")
                displayValues.Append(nextKey)
                displayValues.Append(" = ")
                displayValues.Append(postedValues(i))
            End If
        Next
        Label1.Text = displayValues.ToString()
    End Sub
    

    C#
    void Page_Load(object sender, EventArgs e)
    {
        System.Text.StringBuilder displayValues = 
            new System.Text.StringBuilder();
        System.Collections.Specialized.NameValueCollection 
            postedValues = Request.Form;
        String nextKey;
        for(int i = 0; i < postedValues.AllKeys.Length; i++)
        {
            nextKey = postedValues.AllKeys[i];
            if(nextKey.Substring(0, 2) != "__")
            {
                displayValues.Append("<br>");
                displayValues.Append(nextKey);
                displayValues.Append(" = ");
                displayValues.Append(postedValues[i]);
            }
        }
       Label1.Text = displayValues.ToString();
    }
    
세션 상태 사용

현재 응용 프로그램의 모든 ASP.NET 웹 페이지에서 세션 상태의 정보를 사용할 수 있습니다. 그러나 세션 상태를 사용하면 서버 메모리가 소모되고, 세션이 만료될 때까지 정보가 저장되므로 단순히 정보를 다음 페이지로 전달하려는 경우보다 많은 오버헤드가 발생할 수 있습니다. 자세한 내용은 방법: 세션 상태에 값 저장방법: 세션 상태에서 값 읽기를 참조하십시오.

세션 상태를 사용하여 정보를 전달하려면

  1. 소스 페이지에서 다음 예제와 같이 전달할 정보를 세션 상태에 저장합니다.

    Visual Basic
    Session("field1") = "value1"
    

    C#
    Session["field1"] = "value1";
    
  2. 대상 페이지에서 다음 예제와 같이 세션 상태의 저장된 정보를 읽습니다.

    Visual Basic
    Dim field1 as String = CType(Session.Item("field1"), String)
    
    C#
    string field1 = (string)(Session["field1"]);
    
소스 페이지에서 공용 속성 값 가져오기

대상 페이지와 정보를 공유할 목적으로 소스 페이지를 디자인하는 경우 두 페이지가 모두 동일한 웹 응용 프로그램의 ASP.NET 웹 페이지이면 페이지 간에 공유할 정보를 노출하는 공용 속성을 소스 페이지에 추가할 수 있습니다. 그런 다음 대상 페이지에서 속성 값을 읽을 수 있습니다.

이 방법은 다음 두 가지 경우에 사용합니다.

소스 페이지에서 공용 속성 값을 가져오려면

  1. 소스 페이지에서 하나 이상의 공용 속성을 만들고 페이지를 저장합니다.

    다음 코드 예제에서는 textCity라는 TextBox 컨트롤의 값을 노출하는 CurrentCity 속성을 보여 줍니다.

    Visual Basic
    Public ReadOnly Property CurrentCity() As String
        Get
            Return textCity.Text
        End Get
    End Property
    

    C#
    public String CurrentCity
    {
        get
        {
            return textCity.Text;
        }
    }
    
    참고 참고

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

  2. 대상 페이지에서 소스 페이지를 가리키는 @ PreviousPageType 페이지 지시문을 추가합니다.

    다음 코드 예제에서는 SourcePage.aspx라는 소스 페이지를 참조하는 PreviousPageType 지시문을 보여 줍니다.

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

    PreviousPageType 지시문을 사용하면 페이지의 PreviousPage 속성이 소스 페이지 클래스로 형식화됩니다.

  3. 대상 페이지 코드에서 PreviousPage 속성에 대한 강력한 형식의 멤버를 사용하여 소스 코드 속성을 읽습니다.

    다음 코드 예제에서는 소스 페이지에 정의된 CurrentCity 속성의 값을 읽습니다.

    Visual Basic
    Label1.Text = PreviousPage.CurrentCity
    

    C#
    Label1.Text = PreviousPage.CurrentCity;
    
같은 응용 프로그램의 소스 페이지에서 컨트롤 정보 가져오기

소스 페이지와 대상 페이지가 모두 ASP.NET 웹 페이지이고 같은 웹 응용 프로그램에 있는 경우 대상 페이지에서 소스 페이지의 컨트롤 값을 읽을 수 있습니다. 필요한 정보가 포함된 공용 속성을 소스 페이지에서 노출하지 않는 경우에 이 방법을 사용할 수 있습니다.

같은 응용 프로그램의 소스 페이지에서 컨트롤 값을 가져오려면

  • 대상 페이지에서 대상 페이지의 PreviousPage 속성을 사용하여 소스 페이지에 대한 참조를 가져온 다음 FindControl 메서드를 호출하여 필요한 컨트롤에 대한 참조를 가져옵니다.

    다음 코드 예제에서는 소스 페이지에 있는 TextBox1 컨트롤의 값을 가져와 Label1 컨트롤에 표시합니다.

    Visual Basic
    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
    

    C#
    if (PreviousPage != null)
    {
        TextBox SourceTextBox = 
            (TextBox) PreviousPage.FindControl("TextBox1");
        if (SourceTextBox != null)
        {
            Label1.Text = SourceTextBox.Text;
        }
    }
    

    FindControl 메서드는 현재 명명 컨테이너에서 컨트롤을 찾습니다. 찾고 있는 컨트롤이 다른 컨트롤 내에 있는 경우에는 먼저 컨테이너에 대한 참조를 가져온 후 컨테이너를 검색하여 원하는 컨트롤을 찾아야 합니다. 이러한 경우는 대개 이전 페이지가 마스터 페이지이고 찾을 컨트롤이 ContentPlaceHolder 컨트롤 내에 있는 경우입니다. 다음 예제는 TextBox1ContentPlaceHolder1이라는 ContentPlaceHolder 컨트롤에 있는 것으로 가정한다는 점을 제외하고 이전 예제와 유사합니다.

    Visual Basic
    If Not Page.PreviousPage Is Nothing Then
        Dim placeHolder As Control =
            PreviousPage.Controls(0).FindControl("ContentPlaceHolder1")
        Dim SourceTextBox As TextBox =
            CType(placeHolder.FindControl("TextBox1"), TextBox)
        If Not SourceTextBox Is Nothing Then
            Label1.Text = SourceTextBox.Text
        End If
    End If
    

    C#
    if (PreviousPage != null)
    {
        Control placeHolder =
            PreviousPage.Controls[0].FindControl("ContentPlaceHolder1")
        TextBox SourceTextBox = 
            (TextBox)placeHolder.FindControl("TextBox1");
        if (SourceTextBox != null)
        {
            Label1.Text = SourceTextBox.Text;
        }
    }
    

    명명 컨테이너에 대한 참조가 없는 경우 컨트롤에 대한 참조를 가져오는 방법에 대한 자세한 내용은 방법: ID를 사용하여 서버 컨트롤에 액세스를 참조하십시오.

참고 항목

작업

개념