이번 시간에는 MovieController 클래스를 만들 것이다.
MVC 패턴의 M은 Model이고 V는 View C는 Controller이다
M은 지난 시간에 추가하였고 C를 이번 시간에 만든다면 다음에 올 것은 V이다
View는 지난 글에서 HelloWorldController를 생성할 때 컨트롤러가 가진 함수인 Index와 Welcome과 같은 이름의 파일인 Index.cshtml, Welcome.cshtml을 생성하였다.
이번 시간에는 컨트롤러를 생성하면서 뷰 페이지를 어떻게 만들어야 할지 구상을 미리 하는 연습과 함께 공부를 시작하도록 하자.
우리가 사용할 스캐폴드는 'Entity Framework를 사용하며 뷰가 포함된 MVC 5 컨트롤러'이다.
참고로 스캐폴드는 아래와 같은 것들이다.
컨트롤러를 생성하면서 추가할 내용은 위와 같다.
Controller.MoviesController.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using MVC_Movie.Data;
using MVC_Movie.Models;
namespace MVC_Movie.Controllers
{
public class MoviesController : Controller
{
private MVC_MovieContext db = new MVC_MovieContext();
// GET: Movies
public ActionResult Index()
{
return View(db.Movies.ToList());
}
// GET: Movies/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// GET: Movies/Create
public ActionResult Create()
{
return View();
}
// POST: Movies/Create
// 초과 게시 공격으로부터 보호하려면 바인딩하려는 특정 속성을 사용하도록 설정하십시오.
// 자세한 내용은 https://go.microsoft.com/fwlink/?LinkId=317598을(를) 참조하십시오.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (ModelState.IsValid)
{
db.Movies.Add(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
// GET: Movies/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// POST: Movies/Edit/5
// 초과 게시 공격으로부터 보호하려면 바인딩하려는 특정 속성을 사용하도록 설정하십시오.
// 자세한 내용은 https://go.microsoft.com/fwlink/?LinkId=317598을(를) 참조하십시오.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
// GET: Movies/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Movie movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
}
Controller가 생성되면 위와 같은 코드를 가지고 있다.
코드 안에는 Index, Details, Create, Edit, Delete의 함수가 View()를 리턴하는 것을 확인할 수 있다. View를 리턴하기 위해서는 View 페이지를 생성해주어야 하는데 Views 폴더에 가보면 Movies라는 폴더와 위에서 말한 함수와 같은 이름의 페이지들이 생성된 것을 확인할 수 있다.
실행해서 페이지가 정상적으로 동작하는지 확인해보자.
생성한 컨트롤러의 이름이 MoviesController 이기 때문에 Controller을 제외한 Movies를 주소에 입력하면 된다.
localhost:port/Movies
정상적으로 접속이 되며 페이지에 적혀있는 타이틀로 Index 페이지임을 확인할 수 있다.
아래에는 Create New 링크형 텍스트가 있는데 클릭해보자.
Create Movie 페이지로 이동되었다.
TextBox에 적절한 데이터를 입력하고 Create 버튼을 누르면
인덱스 페이지로 이동이 되며 데이터 또한 들어온 것을 확인할 수 있다.
좌측 상단에 위치한 서버 탐색기 항목에서 연결되어 있는 데이터 베이스 확인이 가능하다.
Movies라는 테이블이 생성되어 있고 테이블 데이터 표시를 누르면
입력한 값이 들어온것을 확인할 수 있다.
페이지 요청과 응답이 정상적으로 이루어지고 있지만 ASP.NET 에서 제공하는 MVC에는 숨겨져있는 마법들이 상당하다. 하나씩 개념을 파헤치기 위해서 테스트를 해보자.
App_Start 폴더에 있는 RouteConfig.cs 파일을 들여다 보면 url 형식이
url: "{controller}/{action}/{id}",
로 입력된 것을 확인할 수 있다.
하지만 우리가 생성한 컨트롤러의 이름은 MoviesController 이고 url에 입력하는 값은 MoviesController 가 아닌 Movies 이다. 그렇다면 컨트롤러를 생성할 때, 생성한 컨트롤러 앞의 이름을 URL로 지정하는 어떤 동작이 실행되었음을 예상할 수 있고, 그러한 동작들이 어디서 진행되는지를 확인하고 싶다.
우선 컨트롤러의 이름을 변경해보겠다.
MoviesController 의 이름을 s 를 뺀 MovieController 로 변경하였고 실행을 하였을 때
위 사진과 같은 오류가 발생하며 접근을 할 수 없게 된다.
그렇다면 변경한 컨트롤러 이름인 Movie를 URL로 입력하여 보겠다.
입력한 URL 에 접근할 수 있지만 Views가 가지고 있는 파일들을 찾을 수 없어서 오류를 반환한다.
Views 폴더의 Movies 를 Movie로 변경해보겠다.
정상적으로 호출이 된다.
이로서 컨트롤러 이름이 변경됨에 따라 URL 주소가 변경이 되고 View 는 컨트롤러와 이름이 일치해야만 파일을 찾을 수 있음을 알 수 있다.
이름을 원래대로 되돌려 놓도록 하자.
'정리' 카테고리의 다른 글
ASP.NET MVC 자습서(7) - 검색기능 추가 (미완성) (0) | 2020.03.20 |
---|---|
ASP.NET MVC 자습서(6) - 편집 메서드 및 편집 보기 검사 (0) | 2020.03.20 |
ASP.NET MVC 자습서(4) -연결 문자열 만들기 및 SQL Server LocalDB 사용 (0) | 2020.03.20 |
ASP.NET MVC 자습서(3) - 모델 추가 (0) | 2020.03.20 |
ASP.NET MVC 자습서(2) - 뷰 추가 (0) | 2020.03.20 |