Taeyo's ASP.NET v1.0 with C# 오탈자 보고

   본문 최초 작성일 : 2003년 03월 03일
   본문 최종 수정일 : 2005년 08월 29일

   작성자 : Taeyo(김 태영)
   편집자 : Taeyo(김 태영)

안녕하세요? taeyo입니다.

다음은 Taeyo's ASP.NET v1.0 with C# 책에서 발견된 오탈자 정보입니다.

진작에 정리해서 올렸어야 하는 것을 이제서야 정리해서 올리게 되었습니다. 많은 분들이 서운해 하셨음을 너무나도 잘 알기에 죄송하다는 말씀밖에는 드릴 말씀이 없습니다.

이번 계기를 통해서 여러분의 질책과 조언으로 반성하는 시간을 가져보았습니다. 다소 건방져 있기도 하고, 다소 게을러져 있기도 한 저를 발견하고 참 많이 가슴이 아팠습니다. 그래도, 이렇게 아직까지 관심을 가져주시고 정문일침을 해 주시는 분들이 있기에 정말로 감사하고도 행복합니다.

앞으로는 더욱 더 노력하는 모습을 보여드릴 것을 약속드립니다
(ps : 어쩌면 책의 다음 쇄는 교정이 된 상태로 출판이 가능할 듯도 합니다. 이에 대한 정보는 차후 실제로 그렇게 될 경우 업데이트 하도록 하겠습니다)

만일, 별도의 DOC 파일로 다운로드 받고자 하신다면 클릭하십시오. [DOWNLOAD]

변경되어져야 하는 구역의 코드는 파란색으로 표시해 두었습니다.

p 180 : .NET Framework 1.1 버전업으로 인한 차이

p 180에 나와있는 예제를 실행하다 보면 Password 컨트롤의 Changed 이벤트가 발생하지 않는 것을 보실 수 있을 것입니다. 이는 그 이벤트가 발생하지 않는 것이 아니라, 보안적인 이유로 Password 컨트롤의 상태값이 저장되지 않도록 .NET 1.1에서 변경이 있었기 때문입니다.

즉, Password 컨트롤의 상태값이 저장되지 않기에 그 값을 입력하지 않으면 이벤트가 일어나지 않는 것처럼 보일 수 있습니다. 직접 Password를 변경하는 경우에는 이벤트가 발생할 것입니다.

p 125

소스 중 오탈자를 바로잡습니다

    public class AnotherStart : Page
    {
        protected Label lblMsg;
        public void btnSubmit_OnClick(Object sender, EventArgs e)         {
            lblMsg.Text = "Good morning ~~ ASP.NET !!";
        }
    }

p 153

상단의 컨트롤 속성, 이벤트 표를 다음과 같이 바로잡습니다.

컨트롤 속성 이벤트
  LinkButton   CommandName, CommandArgument, Text, CausesValidation   OnClick, OnCommand
  ImageButton   CommandName, CommandArgument, Text, CausesValidation   OnClick, OnCommand
.. 이하 생략 ..

p 196

그림 6-56를 바로잡습니다

위의 그림에서 txtPassword_TextChanged() 라는 부분은 txtSingle_TextChanged() 로 표기되는 것이 올바릅니다.

p 198

소스 중 대,소문자를 바로잡습니다

    private void Page_Load(object sender, System.EventArgs e)
    {
        // 여기에 사용자 코드를 배치하여 페이지를 초기화합니다.
        if(!Page.IsPostBack)
        {
            ... 이하 생략 ...

p 200 : 오탈자

그림 6-59 설명 중 "bgColor 속성"은 "BackColor 속성"으로 바로잡아야 합니다.

p 230

하단의 컨트롤 속성설정 표를 다음과 같이 바로잡습니다.

TextBox   (ID)   txtPwd
  BorderStyle   Groove
TextBox   (ID)   txtPwdConfirm
  BorderStyle   Groove
Button   (ID)   Button1
  Text   Submit
CompareValidator   (ID)   CompareValidator1
  ControlToValidate   txtPwdConfirm
  ControlToCompare   txtPwd
.. 이하 생략 ..

p 236

컨트롤 속성설정 표를 다음과 같이 바로잡습니다.

CompareValidator   ID   CompareValidator3
  ControlToValidate   TextBox2
.. 이하 생략 ..

p 251

그림 7-28을 바로잡습니다

위의 그림에서 CheckGeneration() 부분은 CheckEvenNumber() 로 표기되는 것이 올바릅니다.

p 254

컨트롤 속성설정 표의 하단을 다음과 같이 바로잡습니다.

.. 이상 생략 ..
RequiredFieldValidator   ControlToValidate   txtPwd
  ErrorMessage   * 비밀번호를 입력해 주세요
  Display   Static
ValidationSummary   HeaderText   다음 사항들을 확인해 주세요
.. 이하 생략 ..

p 279

소스 중 오탈자를 바로잡습니다("를 추가해야 함)

    for(int i=0; i < ListBox1.Items.Count; i++)
    {
        if(ListBox1.Items[i].Selected == true)
            txt += ListBox1.Items[i].Text + " (" + ListBox1.Items[i].Value + ")";
    }

p 309

소스 중 대,소문자를 바로잡습니다

    public string Url
    {
        set {HyperLink1.NavigateUrl = value;}
    }

    public string Text
    {
        set {HyperLink1.Text = value;}
    }

    .. 이하 생략 ..

p 319

소스 중 오탈자를 바로잡습니다

    private string headerBgColor = "black";
    private string headerForeColor = "white";

p 334

페이지에서 제목의 오탈자를 바로잡습니다

03 Session 개체(HttpSessionState 클래스)

p 352

한자를 잘못 표기한 부분을 바로잡습니다(창피하네염 ㅜㅜ)

만일, Response 개체가 가진 모든 기능을 살펴보고 싶다면 [VS.NET 도움말]을 이용해 보기 바란다. 그리고, 개인적으로는 이 개체의 사용법을 위해서 ASP 서적을 한번 참고해 보는 것도 도움이 되리라 생각한다. 온고지신(溫故知新)이라는 말을 한번쯤 떠올리면서 말이다

p 402

페이지 중 [TIP]을 바로잡습니다(첫번째 줄)

그러므로, FileEx02.aspx 예제에서 FileInfo 클래스를 생성하고, CreateText 메서드를 통해서 StreamWriter 개체를 얻는...

p 434

페이지 중간소스에 코드를 추가합니다

    protected TableUserControl TableUC;

    private void Page_Load(object sender, System.EventArgs e)
    {
        .. 이하 생략 ..

p 440

소스에 코드를 추가합니다

    <%@ Page language="c#" Codebehind="main.aspx.cs" AutoEventWireup="false"
             Inherits="TaeyoAspNet.Navigator.main" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
        <HEAD>
            <title>main</title>
            <LINK href="../Style.css" type="text/css" rel="stylesheet">
        </HEAD>
        <body>
            <form id="main" method="Post" runat="server" action="main.aspx" >
                <table width="100%" bgColor="white" border="0">
                ...

p 442

소스 중 대,소문자를 바로잡습니다

    private string virPath, strPath;

    private void Page_Load(object sender, System.EventArgs e)
    {
        .. 이하 생략 ..

p 453 : .NET Framework 1.1 버전업으로 인한 차이

소스 중 [체크포인트 3]를 바로잡습니다

소스에서는 Path.Combine() 메서드를 소개하고 있습니다만, .NET 1.1부터 이 메서드는 두 경로를 결합할 경우, 윈도우즈 경로로 결합을 합니다. 그러므로, 경로의 결과가 /TaeyoAspNet/Images 가 아닌 /TaeyoAspNet\Images가 나올 수 있다는 것입니다. 그러한 이유로, 소스를 다음과 같이 보강하시기 바랍니다.(소스 길이 관계상 변수명을 p로 하였으나 이는 여러분의 편의에 따라 변경하셔도 됩니다)

string p = Path.Combine(virPath, fol.Name);
p = p.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
link.NavigateUrl = "main.aspx?Folder=" + p;

p 455

소스 중 [체크포인트 4]를 바로잡습니다

    long size = GetDirectorySize(fol.FullName);    //체크포인트 4
    td = new TableCell();
    td.Text = size.ToString() + " 바이트";
    ...

p 469

페이지의 하단 소스를 바로잡습니다

    int lastSlashIndex = virPath.LastIndexOf("/");
    string parentVirPath = virPath.Substring(0, lastSlashIndex);

    link = new HyperLink();
    link.NavigateUrl = "download.aspx?FilePath=" + virPath + "/" + file.Name;
    link.Text = " " + file.Name;

    td.Controls.Add(img);
    td.Controls.Add(link);
    tr.Cells.Add(td);

p 479, 481 : .NET Framework 1.1 버전업으로 인한 차이

페이지의 하단 소스를 바로잡습니다

    private void btnUpload_Click(object sender, System.EventArgs e)
    {
        //파일을 업로드할 경로의 지정. strPath는 현재 폴더의 물리적인 경로
        string dirPath = strPath;

        if(fileUpload.PostedFile.FileName != string.Empty)
        {
            try
            {
                ...

.NET 1.1부터는 파일을 지정하지 않아도 PostedFile 개체의 값이 null이 아닙니다. 고로, PostedFile가 null인지 여부를 체크하는 것이 아니라 그 파일의 이름이 존재하는 지를 검사하는 것이 더 효과적입니다.

p 502 : .NET Framework 1.1 버전업으로 인한 차이

페이지 중 표의 하단 내용을 바로잡습니다(.NET 1.1에서 변경된 부분입니다)

.. 이상 생략 ..
timeout   인증 쿠키값이 지속될 시간을 분 단위로 지정한다. 기본값은 30분이다.
path   쿠키의 경로를 지정한다. 기본값은 슬래시(/)이다.

p 680

페이지 중 [NOTE]를 바로잡습니다

웹 폼 페이지 자체에 네임스페이스를 참조할 경우에는 <%@ Import NameSpace="네임스페이스명" %>를 사용한다.

p 689

페이지의 하단 소스를 바로잡습니다.(함수 안에 있던 코드를 밖으로 꺼냅니다)

    private void Page_Load(object sender, System.EventArgs e)
    {
        if(!IsPostBack)
            BindDataList();
    }

    private string connectStr = "Server=(local); database=Pubs; user id=sa";

    private void BindDataList()
    {
        SqlConnection Con = new SqlConnection(conectStr);

        ... 이하 생략 ...

p 690

페이지의 하단 소스를 바로잡습니다.

    <asp:DataList id="DataList1" runat="server" GridLines="Both" Width="400">
        <HeaderTemplate>
            <b>이 달의 추천도서</b>
        </HeaderTemplate>
        <ItemTemplate>
          <div>
            <img src='images/Title-<%# DataBinder.Eval(Container.DataItem, "title_id")%>.gif'
                hspace="10" align="left" />
            제목 : <b><%# DataBinder.Eval(Container.DataItem, "title") %></b><br />
            가격 : <%# DataBinder.Eval(Container.DataItem, "price", "$ {0}") %><br />
              <%# DataBinder.Eval(Container.DataItem, "notes") %>
          </div>

p 713

페이지의 하단의 문장을 바로잡습니다

| CancelCommand |

이제 CancelCommand 부분을 한번 다루어 보도록 하자. 이전과 같은 방법으로 웹 폼 디자인 모드로 가서 DataList를 선택한 다음 [속성 창]에서 번개 모양의 버튼을 클릭한 뒤, 출력되는 이벤트들 중에서 CancelCommand를 선택하고, 우측 칸에서 더블 클릭을 하자. 그러면, 코드 비하인드 페이지로 이동되며, 자동으로 DataList1_CancelCommand 이벤트 처리기가 생성되어져 있을 것이다. 그 구역에 다음과 같은 코드를 작성해 보자.

p 822

페이지의 중간의 소스를 바로잡습니다.

    if(reader.Read())
    {
        lblName.Text = reader["name"].ToString();
        lblMail.Text = reader["email"].ToString();
        lblTitle.Text = reader["title"].ToString();
        lblInputDate.Text = reader["inputDate"].ToString();
        lblReadCount.Text = reader["readCount"].ToString();

        lblContent.Text = reader["content"].ToString();
        string content = reader["content"].ToString();
        if(content != null)
            lblContent.Text = content.Replace("\r", "<BR>");
    }
    else
    {
        ...

p 840

페이지의 상의 소스를 바로잡습니다(변수 초기화를 해주십시오)

    private string seq = string.Empty ;

    private void Page_Load(object sender, System.EventArgs e)
    {
        ...

p 850

페이지의 상의 소스를 바로잡습니다(괄호 추가)

    string refer = Request.UrlReferrer.ToString();
    string ServerPath = Request.Url.ToString();
    ServerPath = ServerPath.Substring(0, ServerPath.LastIndexOf("/"));

    if(refer.IndexOf(ServerPath) == -1)
        Response.Redirect("List.aspx");

p 853

페이지의 상단의 문장을 바로잡습니다.

(2) <PagerStyle>를 편집하여, 페이징의 출력 디자인을 지정한다.

p 854

페이지의 하단의 제목 문장을 바로잡습니다.

| <PagerStyle>의 편집|

p 1014

페이지 중 [NOTE]를 바로잡습니다

DROP PROCEDURE UP_SELECTMemberBoardCount

p 1031

페이지의 중간의 소스를 바로잡습니다.

    private void Page_Load(object sender, System.EventArgs e)
    {
        seq = Request.QueryString["seq"];
        if(seq == null)
            Response.Redirect("list.aspx");

        if(!IsPostBack)
        {
            LoadData();

            //사용자를 확인하여, 부적절한 사용자는 list.aspx로 분기시킨다
            if(User.Identity.Name != lblName.Text)
                Response.Redirect("list.aspx");
    }

p 1035

그림 24-23을 바로잡습니다

위의 그림에서 UP_UPDATEMemberBoard 라는 부분은 UP_DELETEMemberBoard 로 표기되는 것이 올바릅니다.

p 1060

페이지의 중간의 문장을 바로잡습니다.

이러한 문제가 발생하는 이유는 현재 Content.aspx 웹 폼에 존재하는 커멘트 입력용 TextBox 컨트롤이 RequiredFieldValidator 컨트롤로 인해 필수 입력 컨트롤이 되어져 있기 때문이다. 다시 말해, 현재의 폼을 포스트백 하거나 서브밋 할 경우 무조건 유효성 검사 컨트롤이 동작하여 폼이 전송조차 되어지지 않기 때문에 문제가 발생하는 것이다. 그렇다면, 이 문제는 어떻게 풀어가나야 할 것인가?

문제의 해결 방법은 간단하다. [수정] 이나 [삭제] 버튼이 눌렸을 경우에는 유효성 검사를 수행하지 않게 하면 되는 것이다. 그리고, 이를 위해서 버튼 컨트롤들은 CausesValidation 이라는 속성을 제공하고 있다. CausesValidation의 기본 값은 true 이며, 그렇기에 웹 폼 위에 놓인 버튼 컨트롤이 클릭될 경우는 언제나 유효성 검사를 거치게 된다(만일, 유효성 검사가 추가되어 있다면). 하지만, 지금과 같이 특정 버튼이 클릭되었을 경우에 한해서는 유효성 검사를 수행하고 싶지 않다면, 그 버튼의 CausesValidation 속성의 값을 false로 지정해 주면 된다. 그러면, 해당 버튼이 클릭되었을 경우에는 폼에 유효성 검사가 있다 하더라도 그 검사를 무시하고 폼을 전송하게 되는 것이다.

그렇다면, 이 사실을 기반으로 Content.aspx 에서 [수정] 버튼과 [삭제] 버튼의 CausesValidation 속성의 값을 false로 변경해 보도록 하자.

p 1068

페이지의 하단의 소스를 바로잡습니다.(,를 제거해야 합니다)

    CREATE  PROCEDURE UP_DELETEComment
        @code    INT
    AS
        DELETE FROM MemberBoard_Comment
        WHERE code = @code

p 1069

페이지의 중간의 소스를 바로잡습니다.

    ALTER  PROCEDURE UP_DELETEComment
        @code    INT,
        @seq     INT
    AS
        UPDATE MemberBoard
        SET commentCount = commentCount - 1
        WHERE Seq = @Seq

        DELETE FROM MemberBoard_Comment
        WHERE code = @code

p 1080

페이지의 중간의 문장을 바로잡습니다.

HTTP와 XML의 결합이 웹 서비스에 효과적이라 사실은 새로운 용어인 SOAP을 출현시켰다. SOAP(Simple Object Access Protocol, '솝' 이라고 발음한다)은 HTTP와 XML을 이용해서 데이터를 인코딩하여 전송하는 새로운 종류의 프로토콜이다.

p 1096

그림 25-24을 바로잡습니다

private void Button1_Click(object sender, System.eventArgs e)란 메서드가 두 번 표기되어져 있었던 부분을 하나만 표기하는 것으로 바로잡았습니다