아래 코드는
ASP.NET MVC 2를 활용하여 기본형 게시판 작성시 사용한
BasicController.cs 파일의 전체 코드를 샘플로 기록해 놓은 자료입니다.
ASP.NET MVC 2에서 ADO.NET Entity Framework를 사용하여,
입력, 출력, 상세, 수정, 삭제, 검색의 처리를 하는 응용 프로그램 작성시
참고하시면 좋을 듯 합니다.
아래 코드 샘플로 만들어진 데모 사이트는 아래 경로에서 확인하실 수 있습니다.
http://demo.VisualAcademy.com/MvcBasic/
using System;
using System.Linq;
using System.Web.Mvc;
using MvcBasic.Areas.Board.Helpers;
using MvcBasic.Areas.Board.Models;
namespace MvcBasic.Areas.Board.Controllers
{
public class BasicController : Controller
{
// Basic 모델 접근 개체 생성
BasicContext context = new BasicContext();
// 기본 출력 형태 : 리스트
// GET: /Board/Basic/
// GET: /Board/Basic/Index
// GET: /Board/Basic/?page=0 식으로 출력
// /Board/Basic/Page/0 식으로 표현하려면, Global.asax 파일을 건드려 함...
public ActionResult Index(int? page)
{
#region [1] 리스트 기본 출력
////[1] 리스트 기본 출력
//// 리스트 출력 : 번호에 따라서 내림차순 정렬해서 List<Basic> 형태로 출력
//var list = context.Basics.OrderByDescending(b => b.Num).ToList();
//return View(list);
#endregion
#region [2] 수작업으로 페이징 처리
////[2] 수작업으로 페이징 처리
//const int pageSize = 10; // 한 페이지에 최근글 10개만 출력
//var list = context.Basics.OrderByDescending(b => b.Num)
// .Skip((page??0) * pageSize) // 앞에서 몇개를 건너뛰기할건지???
// .Take(pageSize) // 몇개를 취할건지???
// .ToList();
//return View(list); // Basic 테이블 형태의 리스트 값이 전달
#endregion
//[3] 페이징 UI를 만들기
const int pageSize = 10; // 한 페이지에 최근글 10개만 출력
var list = context.Basics.OrderByDescending(b => b.Num);
var pagedList = new PaginatedList<Basic>(list, (page ?? 0), pageSize);
return View(pagedList); // Basic 테이블 리스트 + 전체 페이지/현재 페이지
}
//
// GET: /Board/Basic/Details/5
// 게시물 상세 보기
public ActionResult Details(int id)
{
// 넘겨온 id(Num)에 대한 단일 레코드 조회
//var view = context.Basics.Where(b => b.Num == id).First();
var view = context.Basics.Where(b => b.Num == id).SingleOrDefault();
if (view == null)
{
return View("NotFound"); // 뷰 추가 : Ctrl+M, Ctrl+V
}
else
{
// 조회수 증가 로직 추가
view.ReadCount++; // 조회수 증가
context.SaveChanges(); // 모델 업데이트
return View(view); // 조회된 데이터 전달
}
}
//
// GET: /Board/Basic/Create
// 기본적인 입력 폼이 보여지는 상태
public ActionResult Create()
{
ViewData["Title"] = "게시판 글쓰기";
GetEncoding();
return View();
}
private void GetEncoding()
{
SelectList sl = new SelectList(new string[] { "Text", "HTML", "Mixed" });
ViewData["Encoding"] = sl;
}
//
// POST: /Board/Basic/Create
// Create 페이지에서 submit 버튼 클릭시 여기로 폼의 값이 전달
[HttpPost]
[ValidateInput(false)] // Page 지시문에 validateRequest="false"와 동일
public ActionResult Create(FormCollection collection)
{
ViewData["Title"] = "게시판 글쓰기";
GetEncoding();
// Basic 클래스형 개체 생성
Basic insert = new Basic();
// 유효성 검사 로직을 추가
// 간단한 유효성 검사 : http://www.asp.net/mvc/tutorials/performing-simple-validation-cs
if (Request.Form["Name"].Trim().Length < 1)
{
// 에러 출력
ModelState.AddModelError("Name", "이름을 입력하세요...");
return View();
}
try
{
// 유효성 검사가 통과되었다면 처리
if (ModelState.IsValid)
{
// TODO: Add insert logic here
UpdateModel(insert); // 입력 폼에 입력된 값을 자동으로 insert 개체에 대입
// 수작업으로 입력
insert.PostDate = DateTime.Now;
insert.PostIP = Request.UserHostAddress; // IP주소
insert.ReadCount = 0; // 조회수 0으로 초기화
// 모델에 데이터 입력
context.Basics.AddObject(insert); // 입력대기
context.SaveChanges(); // 대기된 CRUD를 실행
return RedirectToAction("Index");
}
else
{
return View();
}
}
catch
{
return View();
}
}
//
// GET: /Board/Basic/Edit/5
// 글 수정하기 페이지 보여주기
public ActionResult Edit(int id)
{
ViewData["Title"] = "글 수정하기";
GetEncoding();
Basic edit = (from b in context.Basics
where b.Num == id
select b).SingleOrDefault();
return View(edit);
}
//
// POST: /Board/Basic/Edit/5
[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(int id, FormCollection collection)
{
ViewData["Title"] = "글 수정하기";
GetEncoding();
// 현재 id에 해당하는 엔터티 하나 가져오기
Basic edit = (from b in context.Basics
where b.Num == id
select b).SingleOrDefault();
// 예전에 입력한 암호와 현재 입력한 암호가 맞으면 수정 진행
if (edit.Password == Request.Form["Password"])
{
try
{
// TODO: Add update logic here
UpdateModel(edit); // 현재 폼의 값을 한번에 전체 모델 업데이트
// 수정하기 페이지에서 눈에 보여지지 않는 부분 처리
edit.ModifyDate = DateTime.Now; // 수정한 날짜
edit.ModifyIP = Request.UserHostAddress; // 수정한 IP주소
// 업데이트 완료
context.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
else
{
// 에러메시지 전송
ModelState.AddModelError("Password", "암호가 틀립니다. 다시 입력하세요...");
// 다시 수정하기 페이지 보여주기
return View(edit);
}
}
//
// GET: /Board/Basic/Delete/5
public ActionResult Delete(int id)
{
// 기본적으로 보여지는 페이지에 엔터티 전달
Basic delete = (from b in context.Basics
where b.Num == id
select b).SingleOrDefault();
return View(delete);
}
//
// POST: /Board/Basic/Delete/5
[HttpPost]
public ActionResult Delete(int id, FormCollection collection)
{
// 기본적으로 보여지는 페이지에 엔터티 전달
Basic delete = (from b in context.Basics
where b.Num == id
select b).SingleOrDefault();
// 내가 수정 또는 삭제하려는 페이지가 없는 경우 체크
if (delete == null)
{
return View("NotFound");
}
if (delete.Password == Request.Form["Password"])
{
try
{
// TODO: Add delete logic here
context.DeleteObject(delete); // 삭제 진행
context.SaveChanges(); // 업데이트 완료
return RedirectToAction("Deleted"); // 리스트 페이지로 바로 이동해도 무관하다...
}
catch
{
return View();
}
}
else
{
ModelState.AddModelError("Password", " 암호가 틀립니다. 다시 입력하세요...");
return View(delete);
}
}
// 삭제 완료 페이지...
public ActionResult Deleted()
{
return View();
}
// 검색 결과 리스트 페이지
public ActionResult Search(string searchField, string searchQuery)
{
// 조검에 따른 검색
if (searchField == "Title") // 제목
{
var find = from b in context.Basics
where b.Title.Contains(searchQuery) // Title Like '홍길동'
select b;
return View(find);
}
else if (searchField == "Name") // 작성자
{
var find = from b in context.Basics
where b.Name.Contains(searchQuery) // Name Like '홍길동'
select b;
return View(find);
}
else if (searchField == "Content") // 내용
{
var find = from b in context.Basics
where b.Content.Contains(searchQuery) // Content Like '홍길동'
select b;
return View(find);
}
else // 전체
{
var find = from b in context.Basics
where
b.Name.Contains(searchQuery) ||
b.Title.Contains(searchQuery) ||
b.Content.Contains(searchQuery)
select b;
return View(find);
}
}
}
}