더북(TheBook)

36.2.4 따라하기 3: 컨트롤러 및 뷰 페이지 만들기

1. DotNetNote 웹 프로젝트의 Controllers 폴더에 CommunityCampController.cs 파일명으로 컨트롤러를 작성하고 기본 제공 코드를 모두 제거한 후 다시 다음과 같이 코드를 작성한다. 생성자에는 리파지터리 클래스를 사용할 수 있도록 매개 변수로 받는 코드가 들어온다. 생성자 주입을 사용해도 되고, 각각의 인스턴스를 직접 생성해도 된다. 작성한 코드는 가장 일반적으로 사용하는 코드 패턴이다. 생성자 이외에 리스트(Index) 및 등록(Create)과 삭제(Delete) 액션 메서드를 작성한다.

▼  Controllers/CommunityCampController.cs

using DotNetNote.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace DotNetNote.Controllers
{
  public class CommunityCampController : Controller
  {
      private ICommunityCampJoinMemberRepository _repository;
      
      // 인터페이스를 통한 생성자 주입 방식 사용: 
      //     Startup.cs에서 services.AddTransient로 등록됨
      public CommunityCampController(
          ICommunityCampJoinMemberRepository repository)
      {
          _repository = repository;
      }
      
      public IActionResult Index()
      {
          // 모든 데이터 출력
          var list = _repository.GetAll();
          
          return View(list);
      }
 
        [HttpGet]
      public IActionResult Create()
      {
          return View();
      }
 
        [HttpPost]
      public IActionResult Create(CommunityCampJoinMember model)
      {
          // 서버 측 유효성 검사 진행
          if (string.IsNullOrEmpty(model.Email))
          {
              ModelState.AddModelError(“Email”, “이메일을 입력하시오.”);
          }
          
          if (ModelState.IsValid)
          {
              ViewBag.Result =
                  $“커뮤니티: {model.CommunityName}, 이름: {model.Name}”;
              
              // 저장
              _repository.AddMember(model);
              TempData[“Message”] = “데이터가 저장되었습니다.”;
              
              return RedirectToAction(“Index”);
          }
          
          return View();
      }
 
        [HttpGet]
      public IActionResult Delete()
      {
          return View();
      }
 
        [HttpPost]
      public IActionResult Delete(CommunityCampJoinMember model)
      {
          if (ModelState.IsValid)
          {
              // 저장
              _repository.DeleteMember(model);
              TempData[“Message”] = “데이터가 삭제되었습니다.”;
              
              return RedirectToAction(“Index”);
          }
          
          return View();
      }
      
      // [Authorize]
     // [Authorize(“Administrators”)] // 관리자 아이디로 접근했을 때 볼 수 있음
      public IActionResult ComCampAdmin()
      {
          // 관리자 페이지
          var list = _repository.GetAll();
          
          return View(list);
      }
  }
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.