ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Page_load 및 Page클래스
    ASP.NET/.NET 프레임워크 2022. 2. 23. 17:29
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
    
    // Language = "C#"
    // ASP.NET 언어를 C#으로 설정한다.
    
    // AutoEventWireup
    // ASPX파일에서 발생한 이벤트를 ASPX.CS파일의 이벤트 처리기에 자동으로 연결해준다.
    // true라면 Page_Load함수를 호출하겠다는 의미
    
    // CodeFile = "*.aspx.cs"
    // 현재 웹 폼 페이지의 코드를 담당하는 코드 숨김 파일을 지정한다.
    
    // Inherits = "클래스명"
    // 코드 숨김 파일의 클래스 이름을 지정한다.
    
    // 참고
    // Trace = "true"
    // 웹 폼을 추적하는 코드를 페이지 아래에 출력한다.
    
    // Debug = "true"
    // 웹 폼 실행 시 발생되는 에러메시지를 자세하게 출력한다.
    
    // ValidationRequest = "false"
    // 웹 폼에서 입력된 HTML태그를 서버 측으로 전송한다. (기본값: true)
    
    // MaintainScrollPositionOnPostback = "true"
    // 상하 스크롤바가 생기는 페이지에서 새로고침하거나 버튼이 클릭될 때 바로 전의 스크롤바 위치로 스크롤 고정한다.
    // Test.aspx
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Test</title>
    </head>
    <body>
            <form id="form1" runat="server">
                <div>
                    <asp:Button ID="btnPostBack" runat="server" Text="다시 게시(PostBack)" OnClick="btnPostBack_Click" />
                    <asp:Button ID="btnNewLoad" runat="server" Text="다시 로드" OnClick="btnNewLoad_Click" />
                </div>
            </form>
    </body>
    </html>
    using System;
    using System.Web.UI;
    
    public partial class Test : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // 처음 로드(IsPostBack = false)된 상태라면
            if(Page.IsPostBack == false)  // 다시 게시가 아니라면
            {
                Response.Write("[1] 처음 로드되었습니다<br>");
            }
    
            // 같은 방법을 다른 코드로
            if(!Page.IsPostBack)  // 다시 게시가 아니라면
            {
                Response.Write("[2] 처음 로드되었습니다.<br />");
            }
    
            if(!IsPostBack)  // 다시 게시가 아니라면,
            {
                Response.Write("[3] 처음 로드되었습니다.<br />");
            }
    
            // 다시 게시 상태라면
            if(Page.IsPostBack == true)
            {
                Response.Write("[4] 포스트백(다시 게시) 되었습니다. <br />");
            }
    
            // 처음 로드 < > 다시 게시
            if (!Page.IsPostBack)
            {
                Response.Write("[5] 처음 로드되었습니다. <br />");
            }
            else
            {
                Response.Write("[6] 포스트백(다시 게시) 되었습니다. <br />");
            }
    
            // [!] Page_Load() 이벤트 처리기는 처음 로드하거나
            // 버튼이 클릭할 때마다 실행
            Response.Write("[7] 폼이 로드할 때마다 실행 <br />");
        }
    
    
        protected void btnPostBack_Click(object sender, EventArgs e)
        {
            // Page.ClientScript.RegisterClientScriptBlock() : 자바스크립트 호출
            string strJs = @"
                        <script>
                        alert('포스트백');
                        </script>
                        ";
    
            // Page 클래스로부터 상속 받기 때문에 생략 가능하다.
            // RegisterClientScriptBlock msdn에서 찾아서 검색하기
    
            Page.ClientScript.RegisterClientScriptBlock(
                this.GetType(), "msg", strJs);
        }
    
         protected void btnNewLoad_Click(object sender, EventArgs e)
        {
            // 현재 페이지로 다시 이동 : 다시 로드
    
            // 한 번 깜빡이고 로드
    
            Response.Redirect(Request.ServerVariables["SCRIPT_NAME"]);
        }
    }
    
    // object 타입의sender
    // 이벤트를 발생시킨 자신을 말한다.
    
    // EventArgs 타입의 e
    // 이벤트가 발생할 때 발행자에게 전달한 데이터를 담는다. (데이터 정의 기본 클래스)

     

    • 처음 로드 / 다시 게시
      • 웹 브라우저 요청 시 처음 실행되는 것 => 처음 로드
      • 웹 폼에서 서버 컨트롤의 버튼 등을 클릭했을 때 웹 페이지가 깜빡거리면서 다시 현재 페이지가 실행되는 것 =>  다시 게시 (포스트백)
    • IsPostBack
      • 현재 페이지를 처음 로드했는지, 다시 게시(포스트백)했는지 확인
    • Page.IsPostBack
      • 웹 폼에 있는 버튼을 클릭하면 클릭 이벤트만 발생하는 것이 아니라 Page_Load이벤트 처리기를 먼저 실행한 후 해당 Button_Click이벤트 처리기가 실행된다.
      • 처음 로드할 때처리가 필요하다면, Page_Load이벤트 처리기의 if (!Page.IsPostBack) { } 코드 블록 안에 정의를 해주어야 한다.
      • 버튼을 클릭했을 때 Page_Load이벤트 처리기를 실행하지 않고 해당 버튼의 고유 기능만 구현하려면, Button 속성에서 CausesValidation속성을 false로 설정한다.
        • Button.CausesValidation
        • <asp:Button ID="cityQueryButton" Text="Submit" CausesValidation="False" onClick="SubmitButton_Click" runat="server" />
        • CausesValidation = false를 사용해서 PostBackUrl 다른 페이지에 다시 게시하는 경우 속성을 false로 설정해야 한다.
        • 참고
          https://yessong.tistory.com/112
    • Page.ClientScript.RegisterClientScriptBlock( )
      • 자바스크립트를 동적으로 웹 페이지에 추가

     

     

    asp.net에서 자바스크립트 사용하기

     

    • Response.Write
    Response.Write(@"
                    <script>
                        alert('클릭됨');
                    </script>
                   ");

     

    • Page.ClientScript.RegisterClientScriptBlock( )
    Page.ClientScript.RegisterClientScriptBlock(this.GEtType(), "원하는단어", "<script>alert('클릭');<script>");

     

    • ClientScript.RegisterStartupScript
    ClientScript.RegisterStartupScript(this.GetType(), "원하는단어", "<script>alert('클릭');</script>");

     

    • 동적인 OnClick이벤트 등록
    this.Button1.Attributes["onclick"] = "alert('동적으로 이벤트 핸들러 등록'); return false;";

     

    • HTML코드단에서 처리  ... OnClientClick
    // Head
    <script language="javascript" type="text/javascript">
        function Hi() {
            window.alert("안녕하세요");
        }
    </script>
    
    
    // Body
    <asp:Button ID="Button" runat="server" Text="Button" OnClientClick="Hi();" />

     

    • ScriptManager
    ScriptManager.RegisterClientScriptBlock(this,
                                            this.GetType(), "", "alert("ID를 블럭해제하였습니다.");
                                            location.href='View.aspx?" + _strUrl + "'", true);
                                
    ScriptManager.RegisterStartupScript(this,
                                        this.GetType(), "", "alert('에러가 발생했습니다.');", true);

     

    ScriptManager
    ASP.NET AJAX스크립트 라이브러리 및 스크립트 파일, 부분 페이지 렌더링, 웹 및 애플리케이션 서비스에 대한 클라이언트 프록시 클래스 생성을 관리한다.
    object > Control > ScriptManager

    예제 1 - 부분 페이지 업데이트 사용 (Partial-Page)

    컨트롤 내부에 UpdatePanel이 있다.

    기본적으로 속성 값 UpdateMode = "Always", ChildrenAsTriggers = "true"

    따라서 자식 컨트롤은 비동기 포스트백을 발생시킨다.

     

    예제 2 - 부분 페이지 업데이트 오류 처리 및 스크립트 등록

    부분 페이지 업데이트 중에 오류가 발생하면 javascript메시지 상자가 표시된다.

    예를 들어, AsyncPostBackError처리기를 제공하고

    이벤트 처리기에서 AsyncPostBackErrorMessage 속성을 설정해서 사용자 지정 오류 처리를 사용하는 방법을 보여준다.

    <// script
    <script runat="server">
    
        protecte void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
        {
            if (e.Exception.Data["ExtraInfo"] != null)
            {
                ScriptManager1.AsyncPostBackErrorMessage =
                    e.Exception.Message +
                    e.Exception.Data["ExtraInfo"].ToString();
            }
            else
            {
                ScriptManager1.AsyncPostBackErrorMessage =
                    "An unspecified error occurred.";
            }
        }
    
    // body
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:ScriptManager ID="ScriptManager1" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError" runat="server">
                ...
                </asp:ScriptManager>
            </div>
        </form>
    </body>

     

     

    ScriptManager ?
    ASP.NET Ajax기능의 중심
    페이지의 모든 ASP.NET Ajax리소스를 관리

     

    • Microsoft Ajax라이브러리 스크립트를 브라우저에 다운로드하고 컨트롤을 사용해서 UpdatePanel사용하도록 설정된 부분 페이지 업데이트를 조정하는 것이 포함된다.
    • ScriptManager로 다음을 수행한다.
      • 부분 페이지 업데이트와 호환되는 스크립트를 등록한다.
      • 릴리스 또는 디버그 스크립트를 브라우저로 보낼지 여부를 지정한다.
      • 컨트롤에 웹 서비스를 등록하여 스크립트에서 웹 서비스 메서드에 ScriptManager대한 엑세스를 제공한다.
    • Partial-Page 렌더링
      • 컨트롤의 EnablePartialRendering (true) 속성이어야 한다.
      • 페이지에 UpdatePanel 컨트롤이 하나 이상 있어야 한다.
      • 속성은 supportPartialRendering (true)_기본값이어야 한다.
      • SupportPartialRendering속성이 명시적으로 설정되지 않은 경우, 해당 값은 브라우저 기능을 기반으로 한다.
      • 비동기 포스트백 및 부분 페이지 업데이트를 사용하도록 스크립트를 렌더링한다.
      • 업데이트할 페이지의 지역은 UpdatePanel 컨트롤을 사용하여 지정된다.
      • ScriptManager컨트롤은 비동기 포스트백을 처리하고 업데이트해야 하는 페이지의 영역만 새로 고친다.

     

    [참고]

    https://docs.microsoft.com/ko-kr/dotnet/api/system.web.ui.scriptmanager?view=netframework-4.8 

     

    ScriptManager 클래스 (System.Web.UI)

    ASP.NET AJAX 스크립트 라이브러리 및 스크립트 파일, 부분 페이지 렌더링, 웹 및 애플리케이션 서비스에 대한 클라이언트 프록시 클래스 생성을 관리합니다.

    docs.microsoft.com

     

    [ ASP.NET CORE 책 참고 ]

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Test</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <!-- 표준 컨트롤 -->
            <div>
                <h1>표준 컨트롤(Standard Control)</h1>
                <h2>[1] 순수 HTML 사용해서 버튼 만들기</h2>
                <input type="button" value="버튼1" id="btnInput" />
                <h2>[2] runat속성을 추가해서 서버 컨트롤 버튼 만들기</h2>
                <input type="button" value="버튼2" runat="server" id="btnHtml" />
                <h2>[3] ASP.NET 표준 컨트롤을 사용해서 버튼 만들기</h2>
                <asp:Button Text="버튼3" runat="server" ID="btnServer" />
            </div>
            <hr />
            <!-- Redirect -->
            <div>
                <asp:Button ID="btnDotNetKorea" runat="server" Text="닷넷코리아" OnClick="btnDotNetKorea_Click" />
                <br />
                <asp:LinkButton ID="btnDevLec" runat="server" OnClick="btnDevLec_Click">데브렉</asp:LinkButton>
                <br />
                <asp:ImageButton ID="btnVisualAcademy" runat="server" AlternateText="비주얼 아카데미" ToolTip="하와소" OnClick="btnVisualAcademy_Click" Style="height: 16px" />
                <br />
            </div>
            <hr />
            <!-- TextBox 컨트롤 -->
            <div>
                <h2>SingleLine : </h2>
                이름 :
                <asp:TextBox ID="txtSingleLine" runat="server" CssClass="myTextAlign" />
                <h2>txtMultiLine : </h2>
                소개 : 
                <asp:TextBox ID="txtMultiLine" runat="server" TextMode="MultiLine" />
                <br />
                <h2>Password</h2>
                암호 : 
                <asp:TextBox ID="txtPassword" runat="server" TextMode="Password" />
                <hr />
                <asp:Button ID="btnOK" runat="server" OnClick="btnOK_Click" Text="확인" />
            </div>
    
            <!-- Request -->
            <div>
                아이디 :
                <asp:TextBox ID="UserID" runat="server"></asp:TextBox><br />
                암호 : 
                <asp:TextBox ID="Password" runat="server"></asp:TextBox><br />
                이름 :
                <asp:TextBox ID="Name" runat="server"></asp:TextBox><br />
                나이 :
                <asp:TextBox ID="Age" runat="server"></asp:TextBox><br />
                <asp:Button ID="btnSubmit" runat="server" Text="전송" OnClick="btnSubmit_Click" />
            </div>
            <hr />
            <!-- IP주소 얻기 -->
            <div>
                IP주소 얻기 <br />
                <asp:Label ID="Label1" runat="server"></asp:Label><br />
                <asp:Label ID="Label2" runat="server"></asp:Label><br />
                <asp:Label ID="Label3" runat="server"></asp:Label>
            </div>
            <hr />
            <!-- MapPath -->
            <div>
                현재 파일(웹 폼)의 물리적인 전체 경로 :
                <asp:Label ID="Label4" runat="server"></asp:Label><br />
                현재 스크립트 파일의 루트 경로 :
                <asp:Label ID="Label5" runat="server"></asp:Label><br />
            </div>
        </form>
    </body>
    </html>

    'ASP.NET > .NET 프레임워크' 카테고리의 다른 글

    Infragistics - Grid 기본  (0) 2022.03.04
    List<T> 클래스  (0) 2022.03.02
    C# - Linq  (0) 2022.02.28
    postback, viewstate, runat  (0) 2022.02.28
    asp.net 관련확장자  (0) 2022.02.28
Designed by Tistory.