logo
border border
              
border border
border border
  Post Subject :: #85. VS 2008을 이용한 블로그 프로그래밍 - Part6     [ASP.NET]
border border
border border
     
이 포스트는 월간 마이크로소프트웨어에 기고한 원고를 재편집한 포스트입니다. 그러므로, 본의 아니게 반말로 진행되고 있습니다. 원래 싸가지가 없어서 그런 것이 아니니 무한 용서를... ^^;;
또한, .NET Framework 3.5 SP1이 적용되기 이전의 소스이므로, 현재의 개발 환경과 다를 수 있습니다. 마소에 제출한 블로그 소스는 블로그 소스 다운로드에서 다운로드하실 수있습니다.

관리자 페이지(Admin.aspx)의 구성

포스트 및 공지사항의 작성과 수정, 그리고 삭제의 기능과 작성된 포스트의 목록 및 공지사항의 목록을 볼 수 있는 화면은 모두 지난 호에서 만든 "Admin.aspx" 페이지를 이용할 것이다. 우선 완성된 "Admin.aspx"의 페이지 디자인을 보면 <화면 9>와 같다.


<화면 9> "Admin.aspx" 페이지의 화면
<화면 9>에서 보는 것과 같이 "Admin.aspx" 페이지는 총 4개의 탭으로 구성되어 있으며, 화면에 표시되는 3개의 탭(포스트 쓰기, 포스트 목록, 공지사항 목록)과, 화면에 표시되지 않는 1개의 숨겨진 탭(포스트 수정)이 있다. 각각의 탭에서 사용하게 되는 기능은 다음과 같다.

● 포스트 쓰기 탭 : 블로그에 등록하는 포스트를 작성할 수 있는 기능을 제공하는 탭으로, 공지사항이라는 체크박스에 체크를 하게 되면 공지사항으로 등록이 되며, 체크박스에 체크를 하지 않게 되면 포스트로써 등록이 된다.
● 포스트 목록 탭 : 작성된 포스트에 대한 목록이 보여지는 탭으로, 작성된 포스트의 제목을 클릭하게 되면, 클릭한 포스트를 수정 및 삭제할 수 있는 포스트 수정 탭 화면으로 이동하게 된다.
● 공지사항 목록 탭 : 작성된 공지사항에 대한 목록이 보여지는 탭으로, 작성된 공지사항의 제목을 클릭하게 되면, 클릭한 공지사항을 수정 및 삭제할 수 있는 포스트 수정 탭 화면으로 이동하게 된다.
● 포스트 수정 탭 : 포스트 목록 탭 또는 공지사항 목록 탭에 있는 목록에서 제목을 클릭하게 되면 활성화되는 탭으로, 클릭한 포스트 또는 공지사항의 정보를 수정할 수 있는 기능과 삭제를 할 수 있는 기능을 제공한다.

"Admin.aspx" 페이지에서 사용되는 탭 컨트롤은 AJAX Control ToolKit에서 제공하는 TabContainer 컨트롤을 사용하고 있다. TabContainer 컨트롤의 스타일은 기본적으로 AJAX Control Toolkit에서 제공되는 스타일이 아닌 사용자 정의 스타일로 정의했으며 TabContainer 컨트롤의 스타일에 관련된 내용은 참고 자료에 나오는 URL을 참고하기 바란다. TabContainer 컨트롤은 4개의 TabPanel 컨트롤을 포함하고 있으며, 이들 TabPanel 컨트롤들은 각기 UpdatePanel 컨트롤을 포함하고 있다. 물론, AJAX 기능을 사용하기 위해서 "Admin.aspx" 페이지의 상단에는 ScriptManager 컨트롤을 추가하였다. 또한, 포스트 또는 공지사항의 수정에 관련된 내용을 가져오기 위해서 페이지 메소드(Page Method)를 사용하였고, "Admin.aspx" 페이지에서 페이지 메소드를 사용가능하게 하기 위해서 ScriptManager 컨트롤의 EnablePageMethods 속성을 true로 설정하였다. "Admin.aspx" 페이지의 소스 코드는 이달의 디스켓을 참고하기 바란다.

블로그의 포스트 작성 기능 구현

이제 블로그 프로그래밍에 있어 핵심적인 기능이라 할 수 있는 포스트를 작성하는 기능에 대해서 설명하도록 하겠다. <화면 9>에서 보는 것처럼, 포스트 쓰기 탭에서는 작성할 포스트의 제목과 본문, 그리고 태그(공지사항을 작성할 경우에는 입력을 하지 않아도 된다.)를 입력하는 TextBox 컨트롤과 공지사항으로 등록할 것인지 일반 포스트로 등록할 것인지를 결정하게 되는 CheckBox 컨트롤, 그리고 포스트로 등록할 경우에 어떤 카테고리로 등록할 것인지를 선택할 수 있는 DropDownList 컨트롤로 구성되어 있다. 카테고리 정보를 가져와서 카테고리 정보를 보여주는 DropDownList 컨트롤로 바인딩하는 코드는 <리스트 4>와 같다.

    // Category 정보를 가져온다.
    private void GetCategoryInfo()
    {
        var categoryInfo = from c in blogDataContext.BLOG_CATEGORIES select c;
 
        foreach (BLOG_CATEGORIES blogCategory in categoryInfo)
        {
            // 포스트 작성 탭의 카테고리 정보에 바인딩
            ddlCategory.Items.Add(new ListItem(
                blogCategory.categoryname.ToString(), blogCategory.categoryid.ToString()));
            // 포스트 수정 탭의 카테고리 정보에 바인딩
            ddlModifyCategory.Items.Add(new ListItem(
                blogCategory.categoryname.ToString(), blogCategory.categoryid.ToString()));
        }
    }
<리스트 4> 카테고리 정보를 가져오는 메소드

제목과 본문 그리고 태그 정보를 입력한 후, 화면 하단에 있는 미리보기 버튼을 클릭하면 작성한 포스트가 화면에 어떻게 보여질 것인가를 확인할 수 있는 미리보기 창이 <화면 10>과 같이 뜨게 된다.


<화면 10> 작성한 포스트에 대한 미리보기 창

화면 하단에 있는 등록 버튼을 클릭하면, <리스트 5>에 보여지는 것과 같이 등록 버튼 클릭에 관련된 코드가 실행되며 정상적으로 등록이 되면 공지사항 체크박스의 체크 유무에 따라 포스트 목록 탭 또는 공지사항 목록 탭에 <화면 11>과 같이 작성한 포스트 또는 공지사항의 정보가 목록으로 보여지게 된다.

// 포스트 쓰기 탭에서 작성 버튼 클릭 시
    protected void btnPostWrite_Click(object sender, EventArgs e)
    {
        try
        {
            // 공지사항 CheckBox가 체크되어 있으면 공지사항으로 저장
            if (chkNotice.Checked)
            {
                BLOG_NOTICES blogNotice = new BLOG_NOTICES();
                blogNotice.noticename = txtPostSubject.Text;
                blogNotice.noticecontent = Server.HtmlEncode(txtPostContent.Text);
                blogNotice.createdate = DateTime.Now;
 
                blogDataContext.BLOG_NOTICES.InsertOnSubmit(blogNotice);
                blogDataContext.SubmitChanges();
                SetNoticeListDataBound();
                ScriptManager.RegisterClientScriptBlock(
                    this, this.GetType(), "setindex", "fnSetTablIndex('3')", true);
            }
            else
            {
                BLOG_POSTS blogPost = new BLOG_POSTS();
                blogPost.postid = Guid.NewGuid().ToString().ToUpper();
                blogPost.postname = txtPostSubject.Text;
                blogPost.postcontent = Server.HtmlEncode(txtPostContent.Text);
                blogPost.categoryid = int.Parse(ddlCategory.SelectedItem.Value.ToString());
                blogPost.tag = txtPostTag.Text;
                blogPost.createdate = DateTime.Now;
                blogPost.viewcount = 0;
                blogPost.commentcount = 0;
 
                blogDataContext.BLOG_POSTS.InsertOnSubmit(blogPost);
                blogDataContext.SubmitChanges();
                SetPostListDataBound();
                ScriptManager.RegisterClientScriptBlock(
                    this, this.GetType(), "setindex", "fnSetTablIndex('2')", true);
            }
 
            SetInitForm();
        }
        catch (Exception ee)
        {
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "error"
                , "alert('" + ee.Message + "::" +  ee.Source + "::" + ee.InnerException + "')", true);
        }
    }
<리스트 5> 등록 버튼 클릭 시의 코드


<화면 11> 작성한 포스트의 목록 정보


Creative Commons License
저작물크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
border border
border border
  이전 포스트 :: #84. VS 2008을 이용한 블로그 프로그래밍 - Part5
  다음 포스트 :: #86. VS 2008을 이용한 블로그 프로그래밍 - Part7
border border
border border
  
# Commented By :: dekiriya At 2/20/2009 2:36:07 PM [D]
오늘은 일빱니다~~~;
연일 계속 되는 강좌 감사드립니다.
전체 쿼리문 좀 부탁드립니다.~~~~~~~~~~~~~~~~~~
# Commented By :: 용하운 At 2/20/2009 5:43:59 PM [D]
아 이빠네요~~
오늘도 잘보고 갑니다~
# Commented By :: 엔틱스 At 2/24/2009 11:16:38 AM [M] [D]
dekiriya :: 음... 누누이 말씀드리지만, LINQ-to-SQL을 사용하기 때문에 쿼리문을 사용하지는 않습니다. (추후에 저장 프로시저는 몇 개 사용하겠지만요...)

용하운 :: 앞으로도 잘 보아 주시기 바랍니다.
# Commented By :: 아기미르 At 3/10/2009 12:15:25 AM [M] [D]
웹 서핑을 하던중 우연히 보물같은 사이트를 찾았습니다.
아직 초보라... 블로그 열심히 따라하고 있습니다.
한가지... Admin.aspx 코드는... ^^; 이달의 디스켓에 있다고 하는데.. 그게 어디있는지.. ^^;
혹시 메일로라도 보내 주실수 있는지.. ^^*
# Commented By :: 꼬기얌얌얌 At 3/12/2009 11:15:47 AM [D]
강좌 맨위에 보시면 강좌다운로드 받으시면 Admin.aspx코드 들어있습니당..^^;
# Commented By :: 나그네 At 5/13/2009 4:39:19 PM [M] [D]
연재되는 글을 열시미 따라하면 공부중에 있는 나그네입니다.^^
따라하는중에 아래와 같은 오류가 발생하는데요..어떻게 해결을 해야할까 망막해서 글을 올립니다.
# Commented By :: 나그네 At 5/13/2009 4:42:18 PM [M] [D]
blogDataContext.BLOG_NOTICES.InsertOnSubmit(blogNotice); 요부분에서 아래와 같은오류가
System.Data.Linq.Table<BlogName.App_Data.BLOG_NOTICES>.InsertAllOnSubmit<TSubEntity>(System.Collections.Generic.IEnumerable<TSubEntity>)' 메서드의 형식 인수를 유추할 수 없습니다. 형식 인수를 명시적으로 지정하십시오.
# Commented By :: 최지훈 At 5/25/2009 12:58:41 PM [M] [D]
소스를 다운로드하셔서 한번 확인해보세요...
화이팅~!!! ^^;;
(무책임한 답변 죄송합니다. ㅠㅠ)
# Commented By :: 나그네 At 5/26/2009 5:48:35 PM [M] [D]
아~~ 죄송..제가 잘못코딩했네요..하하하..
감사합니다...
# Commented By :: Woos At 6/1/2009 7:32:24 PM [D]
지금 하나씩 따라하는 중인데요^^ 궁금한게 있어서요..
드랍다운리스트에 카테고리는 디비에 임의로 값을 넣어야 하나요?
  NAME ::   PASSWORD ::
  MAIL ::   HOMEPAGE ::
  COMMENT ::
border border
border border
COPYLEFT NX Blogs.   opml

LogIn ]  [ Join NX Blog's ]
border border
border border
mvp
border border
border border
  border
   Personal Thought
   ASP.NET
   ASP.NET AJAX
   ASP.NET MVC Framework
   Dev Story(Etc.)
   Reading the Articles
   About Microsoft / MSDN
   Certification Talk
   Useful Dev Tools
border border
border border
  border
   2010 년 09 월 (1)
   2010 년 06 월 (1)
   2010 년 05 월 (1)
   2010 년 04 월 (1)
   2010 년 03 월 (1)
   2010 년 02 월 (5)
   2010 년 01 월 (1)
   2009 년 04 월 (2)
   2009 년 03 월 (3)
   2009 년 02 월 (6)
   2009 년 01 월 (1)
   2008 년 10 월 (1)
   2008 년 06 월 (8)
   2008 년 05 월 (10)
   2008 년 04 월 (13)
   2008 년 03 월 (9)
   2008 년 02 월 (17)
   2008 년 01 월 (5)
   2007 년 12 월 (8)
   2007 년 11 월 (15)
   2007 년 10 월 (36)
   2007 년 09 월 (33)
   2007 년 08 월 (17)
   2007 년 07 월 (23)
   2007 년 06 월 (4)
   2007 년 05 월 (16)
   2007 년 04 월 (26)
   2007 년 03 월 (14)
   2007 년 02 월 (25)
   2007 년 01 월 (41)
   2006 년 12 월 (38)
   2006 년 11 월 (0)
   2006 년 10 월 (0)
   2006 년 09 월 (1)
   2006 년 08 월 (9)
   2006 년 07 월 (1)
border border
border border
  border
   #128. 無題
    By 최지훈 At 9/3/2010
   127. [예약구매] 실전. jQ...
    By 최지훈 At 6/13/2010
   #126. 무제
    By 최지훈 At 5/23/2010
   #125. 요즘 근황?
    By 최지훈 At 4/15/2010
   #124. ASP.NET 4 책을...
    By 최지훈 At 3/12/2010
   #97. ASP.NET 4 New...
    By 최지훈 At 2/12/2010
   #96. ASP.NET 4 New...
    By 최지훈 At 2/10/2010
   #95. ASP.NET 4 New...
    By 최지훈 At 2/9/2010
   #94. ASP.NET 4 New...
    By 최지훈 At 2/2/2010
   #93. ASP.NET 4 New...
    By 최지훈 At 2/1/2010
border border
border border
  border
   배는숨겨야지 에서 나도 모르게 빵...
    By ㅋㅋ At 8/17/2010
   Sorry. I don't hav...
    By 최지훈 At 8/16/2010
   내 생애 번역서는 이걸루 끝이다....
    By 최지훈 At 8/16/2010
   네..^^;; 저도 감사합니다.
    By 최지훈 At 8/16/2010
   IIS 버전이 업그레이드되면서 해...
    By 최지훈 At 8/16/2010
   나중에 비슷한 차로 태워는 줄께~...
    By 최지훈 At 8/16/2010
   나도 사주세요 저 차
    By ㅋㅋ At 8/12/2010
   저도 URL Rewriting 이...
    By 초보 At 8/7/2010
   감사드립니다^^
    By 이한철 At 7/28/2010
   오우~ 형 ㅊㅋㅊㅋ해~ 결국 했구...
    By 산티아고 At 7/26/2010
border border