-
ASP.NET MVC 자습서(6) - 편집 메서드 및 편집 보기 검사ASP.NET 2020. 3. 20. 15:17반응형
이번 시간에는 MoviesController에 대해 생성된 편집과 관련된 메서드 및 뷰에 대해서 공부할 것이다.
본론에 들어가기에 앞서 날짜 정보를 정확하게 입력하기 위해 어노테이션을 사용해보자.
Model.Movie.cs 에
[Display(Name = "Release Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
위와 같은 Diversion을 입력할 것인데 위 데이터를 입력하기 위해서는
using System.ComponentModel.DataAnnotations;
위 내용을 먼저 추가해주어야 한다. 그렇지 않으면 아래의 사진처럼 인식을 할 수 없다.
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Linq; using System.Web; namespace MVC_Movie.Models { public class Movie { public int ID { get; set; } public string Title { get; set; } [Display(Name = "Relaese Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } } public class MovieDBContext : DbContext { public DbSet<Movie> Movies { get; set; } } }
입력된 양식은 위와 같다.
빌드를 하고 Create 페이지에 접근하면
위 사진과 같이 Relase Date의 텍스트 박스가 연도-월-일 을 입력할 수 있는 폼으로 바뀐 것을 확인할 수 있다.
생성되어 있는 데이터를 변경해보자.
기존에 있던 날짜 데이터는 Model에 새로 생성한 형식이 아니기 때문에 연도나 월, 일 중 한 항목이라도 제외한 상태로 편집을 하였을 때 유효성 검사를 통과하지 못하게 된다. 유효성 검사가 일어나는 부분은 스크린샷 촬영을 깜빡하였다. 직접 테스트해보길 바란다.
위에서 Edit 이라는 링크를 클릭하여 영화의 정보를 수정할 수 있었다. 그렇다면 Edit이라는 링크는 어디서 지정되어 있는 것일까? 처음 데이터를 뿌려주고 edit이라는 링크가 출력되어 있었던 Index 페이지를 찾아가 보자.
Views.Movies.index.cshtml
@model IEnumerable<MVC_Movie.Models.Movie> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Title) </th> <th> @Html.DisplayNameFor(model => model.ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Genre) </th> <th> @Html.DisplayNameFor(model => model.Price) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </td> </tr> } </table>
View 페이지는 위와 같은 형식으로 만들어져 있다.
링크가 연결된 곳을 확인하였으니 좀 더 자세히 들여다보자.
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
우선은 @가 붙어 있으니 함수를 실행한다는 것을 알 수 있다.
View Page의 테이블을 HTML로 만들었다면 링크도 Edit으로 만들 수는 없었을까?
가령 @HTML 대신 <a href="~/Movies/Edit">Edit</a> 처럼 말이다.
테스트해보겠다.
수정한 내용은 위와 같다.
멀쩡해 보이지만 위의 Edit에는 매개변수인 ID값이 포함되어 있지 않다. 접근을 할 수 없을 테니 <script>를 추가하여 JavaScript 함수를 입력하고 DataBase를 연결 한 뒤에 Query문을 작성하..
제공해주는 것을 사용하도록 하자.
두 번째로 확인할 것은 안에 Edit이라는 텍스트가 두 개가 지정이 되어 있다 라는 것이다.
이 둘의 차이점을 이해하는 것을 돕기 위해 _Layout.cshtml으로 돌아가 보자.
_Layout.cshtml에서도 ActionLink를 찾을 수 있다.
위에서 표시하는 리스트는 아래의 사진과 같다.
홈의 URL은 기본으로 설정되어있기 때문에 확인할 수 없지만 정보 페이지로 접근하여 URL을 확인해 본다면
URL 이 위 사진과 같이 Controller 명 뒤에 About이라는 뷰페이지명이 적혀있는 것을 확인할 수 있다.
그렇다면 ActionLink에 포함되어 있는 첫 번째 'Edit'은 HTML 상에서 보여주기 위한 값이었으며
두 번째 'Edit'은 View Page와 연결된 것을 알 수 있다.
세 번째 항목은 new {id=item.id} 라고 입력되어 있는데 파라미터값임을 쉽게 유추할 수 있지만
-Layout.cshtml 페이지에 있는 세번째 항목은 'Home' 이기 때문에 파라메터 값보다는 컨트롤러 이름이 맞는 것 같기도 하다. 어떤 차이가 있는지 확인해보자.
Index.cshtml의 ActionLink
_Layout.cshtml의 ActionLink
세 번째 인자로 받는 값들이 다름을 알 수 있다.
위 사진들을 통해서 알 수 있는 것은 ActionLink에 매개변수를 넣어서 사용하는 방식은 다양하며 이를 통해 Html페이지와 서버 간의 통신을 더욱 간편하고 자유롭게 할 수 있음을 알 수 있다.
MoviesController - Edit
// 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); }
MoviesController 내에는 총 2개의 Edit 메서드가 존재한다.
아래의 Edit 에는 [HttpPost]와 [ValidateAntiForgeryToken] 특성이 존재하는데
[HttpPost]는 이 메서드가 Post 방식만 받아들이겠다는 것을 말한다.
[ValidateAntiForgeryToken]는 XSRF(사이트 간 요청 위조)를 막기 위한 방식인데 자세한 것은 직접 공부하도록 하자.
'ASP.NET' 카테고리의 다른 글
[ASP.NET] WebForms 마스터페이지와 중첩 마스터페이지 (작성중) (0) 2020.04.02 ASP.NET MVC 자습서(7) - 검색기능 추가 (미완성) (0) 2020.03.20 ASP.NET MVC 자습서(5) - 컨트롤러에서 모델의 데이터에 엑세스 (2) 2020.03.20 ASP.NET MVC 자습서(4) -연결 문자열 만들기 및 SQL Server LocalDB 사용 (0) 2020.03.20 ASP.NET MVC 자습서(3) - 모델 추가 (0) 2020.03.20