Programming/.NET
ASP.NET에서 서로 다른 두 페이지간 포스팅이 이루어 져야 하는 경우를 살펴보고자 합니다. 아래 예제는 WebForm1.aspx에서 WebForm2.aspx로 포스트가 전송되어야함을 가정한 경우입니다.

먼저 WebFrom1의 aspx 페이지 내용을 다음과 같이 입력합니다.
<form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/WebForm2.aspx" />
    </div>
</form>
<코드 1-1>

Button1의 PostBackUrl 속성에 주목하시기 바랍니다. 이 속성에 의해 Button1을 클릭하는 경우 WebForm1의 내용을 WebForm2로 전송하게 됩니다.

그럼 WebForm1의 내용을 전달받게될 WebForm2에서는 다음과 같이 처리되어야 합니다.
protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("WebForm1의 TextBox1 내용 : " + (PreviousPage.FindControl("TextBox1") as TextBox).Text);
}
<코드 1-2>포스트로 전송되어온 WebForm1의 데이터를 받기 위하여 WebForm2에서는 PreviousPage 속성의 FindControl 메서드로 WebForm1의 TextBox 컨트롤을 찾아내서 해당 컨트롤의 값을 가져옵니다.

만약 FindControl 메서드를 통하여 일일이 컨트롤을 찾기가 번거롭다면 다음 방법을 사용할 수도 있습니다.

우선 WebForm1 클래스에서 TextBox에 접근할 수 있는 속성을 설정합니다.
public TextBox webform1_tetbox
{
    get {
        return TextBox1;
    }
}
<코드 1-3>

그런다음 WebForm2에서 PreviousPageType 지시자를 사용해 다음과 같이 WebForm1.aspx 에 대한 VirtualPath 속성을 설정하고
<%@ PreviousPageType VirtualPath="~/WebForm1.aspx" %>
<코드 2-1>

WebForm2의 cs단에서 FindControl 메서드를 사용하는 대신 PreviousPage속성에 <코드 1-3>에서 정의한 속성을 지정하면 됩니다.
Response.Write("WebForm1의 TextBox1 내용 : " + (PreviousPage.webform1_tetbox as TextBox).Text);
<코드 1-4>
사실 이 방법이 여러모로 편리한데 이를 테면 컨트롤이 아닌 특정 변수를 통해 포스트로 데이터를 전송하고자 하는 경우
protected void Page_Load(object sender, EventArgs e)
{
    PostData = "hi!";
}

public string PostData
{
    get;
    set;
}
<코드 1-5>
코드 1-5처럼 특정 변수에 대한 속성을 정의하여 포스트전송할 페이지(WebForm1)에서 해당 값을 설정하고
Response.Write("WebForm1의 TextBox1 내용 : " + PreviousPage.PostData);
<코드 1-6>

WebForm2에서는 위와 같이 PreviousPage에 해당 속성을 정의하기만 하면 값을 가져올 수 있게 됩니다.

그런데 여기서 만약 WebForm2가 단지 포스트전송되어오는 데이터만을 대상으로 하는 페이지라면 누군가 WebForm2로 바로 접근하는 경우에 문제가 발생할 수 있습니다. 따라서 WebForm2의 입장에서 자신에게 직접들어오는 것인지 아니면 포스트전송으로 들어오는 것인지를 판단해야할 필요가 있는것입니다.

그래서 WebForm2에서는 코드1-7과 같이 PreviousPage의 존재여부와 IsCrossPageBack 속성을 통해 포스트로 들어오는지의 상황을 체크해야 합니다.
protected void Page_Load(object sender, EventArgs e)
{
    if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
        Response.Write("WebForm1의 TextBox1 내용 : " + PreviousPage.PostData);
    else
        Response.Write("올바르지 않은 접근입니다.");
}
<코드 1-7>

버튼에 PostBackUrl 을 지정하여 다른 페이지로 데이터를 POST 하는 경우 한가지 주의해야할 사항이 있는데 PostBackUrl 과 OnClientClick 속성을 같이 사용하는 경우 OnClientClick 에 return 을 걸어서는 안됩니다. PostBackUrl 을 지정하면 내부적으로 데이터 POST를 위한 스크립트를 생성하게 되는데 return 을 걸게되면 생성된 스크립트부분이 통과되지 못하기 때문입니다.

따라서 다음과 같이 OnClientClick 에 return 을 제외하고 스크립트함수 파라메터부분에 event 를 추가한 다음
OnClientClick="javascript:agree_check(event);"
해당 함수 내부에서 페이지의 POST를 중단해야 하는 시점에 event.preventDefault(); 를 추가하도록 합니다.
if (!$('#agree1').is(':checked')) {
 alert('회원 가입을 위해서는 개인정보 제공동의가 필요합니다.');
 $('#agree1').focus();
 event.preventDefault();
 return false;
}
0 0