관리 메뉴

IT 쟁이

ASP.NET 1.x 방명록만들기 방명록 수정하기 (3) 본문

ASP.NET Ex

ASP.NET 1.x 방명록만들기 방명록 수정하기 (3)

클라인STR 2008. 2. 5. 00:48

방명록 수정폐이지는 Write.aspx UI와 동일하게 사용합니다.

사용자 삽입 이미지

Page_Load 이벤트에서 현재 폐이지의 정보와 게시물의 ID를 ViewState에 저장합니다. 이는 취소버튼을 선택했을때의 처리를 해줄때 사용됩니다. 물론 쿠키나 캐시등을 사용해도 상관없습니다.

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Id = int.Parse(Request.QueryString["id"].ToString());
            CurrentPage = int.Parse(Request.QueryString["page"].ToString());
            ViewState["Id"] = Id;
            ViewState["CurrentPage"] = CurrentPage;

            //현재 내용을 게시물에서 가져오기
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Guest"].ConnectionString);
            SqlCommand cmd = new SqlCommand("SELECT Write,Email,Password,Content FROM GuestBook WHERE Id=@id", con);
            cmd.Parameters.Add("@id", SqlDbType.Int);
            cmd.Parameters["@id"].Value = Id;

            try
            {
                con.Open();
                SqlDataReader Reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                if (Reader.Read())
                {
                    txtName.Text = Reader["Write"].ToString();
                    txtEmail.Text = Reader["Email"].ToString();
                    txtContent.Text = Reader["Content"].ToString();
                }
                else
                {
                    Page.RegisterStartupScript("script", "<script>alert(잘못된 요청입니다.);</script>");

                }
                Reader.Close();
            }
            catch (Exception ex)
            {
                this.lblError.Text = ex.Message;
            }
           
        }
       
    }

데이터베이스의 테이블에서 게시글의 ID 에 해당하는 데이터에 내용을 가지고 옵니다.

수정하기와 취소하기 버튼을 더블클릭하여 이벤트 메서드를 다음과 같이 정의 합니다.

사용자 삽입 이미지


UpdateContent()함수는 버튼을 선택할경우 변경된 내용을 업데이트 하는 함수이며 , BtnCancel()함수는 버튼을 선택할경우 이전의 리스트 폐이지로 폐이지 정보를 다시 변경합니다.
IsPassword()함수는 패스워드를 체크하여 틀렸을경우 Update구문을 실행시키지 못하게 체크하는 함수입니다.
여기서는 한번더 데이터베이스에 접근하였지만, 최초 로딩때 암호정보를 다른 데이터필드나 변수에 저장해놓고,
현재 입력된 패스워드 정보를 비교해주는게 좀더 효율적이지 않나 생각됩니다.


private bool IsPassword()
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Guest"].ConnectionString);
        string query = "SELECT COUNT(Id) FROM GuestBook WHERE Id=@id AND Password=@password";
        SqlCommand cmd = new SqlCommand(query,con);
        cmd.Parameters.Add("@id", SqlDbType.Int);
        cmd.Parameters["@id"].Value = int.Parse(ViewState["Id"].ToString());
        cmd.Parameters.Add("@password", SqlDbType.VarChar, 20);
        cmd.Parameters["@password"].Value = txtPass.Text;
        con.Open();
        if ((int)(cmd.ExecuteScalar())>0)
        {
            return true;
        }

        return false;
    }

UpdateConten()함수는 현재 패쓰워드의 정보가 이전에 작성한 정보와 같은지를 확인하여 같을경우에만 Update를 실행시킵니다. 그리고 Response.Redirect()함수를 호출하여 이전에 리스트 폐이지를 화면에 출력합니다.
이때 SqlDataSource의 파라메터를 설정해 줍니다.

사용자 삽입 이미지


 private void UpdateContent()
    {
        if (IsPassword())
        {

            try
            {

                SqlDataSource1.Update();
                Response.Redirect("List.aspx?page=" + ViewState["CurrentPage"].ToString());
            }
            catch (Exception ex)
            {
                lblError.Text = ex.Message;
            }
        }
        else
        {
            Page.RegisterStartupScript("script", "<script>alert(비밀번호가 일치하지 않습니다.);</script>");
               
        }
       
    }

Comments