세부 정보 및 삭제 메서드 개선(C#)
작성자: Rick Anderson
참고 항목
이 자습서의 업데이트된 버전은 ASP.NET MVC 5 및 Visual Studio 2013을 사용하는 여기에서 사용할 수 있습니다. 더 안전하고 훨씬 더 간단하게 팔로우할 수 있으며 더 많은 기능을 보여 줍니다.
이 자습서에서는 무료 버전의 Microsoft Visual Studio인 Microsoft Visual Web Developer 2010 Express Service Pack 1을 사용하여 ASP.NET MVC 웹 애플리케이션을 빌드하는 기본 사항을 설명합니다. 시작하기 전에 아래에 나열된 필수 구성 요소를 설치했는지 확인합니다. 웹 플랫폼 설치 관리자 링크를 클릭하여 모두 설치할 수 있습니다. 또는 다음 링크를 사용하여 필수 구성 요소를 개별적으로 설치할 수 있습니다.
- Visual Studio Web Developer Express SP1 필수 구성 요소
- MVC 3 도구 업데이트 ASP.NET
- SQL Server Compact 4.0(런타임 + 도구 지원)
Visual Web Developer 2010 대신 Visual Studio 2010을 사용하는 경우 Visual Studio 2010 필수 구성 요소 링크를 클릭하여 필수 구성 요소를 설치합니다.
C# 소스 코드가 포함된 Visual Web Developer 프로젝트는 이 항목과 함께 사용할 수 있습니다. C# 버전을 다운로드합니다. Visual Basic을 선호하는 경우 이 자습서의 Visual Basic 버전 으로 전환합니다.
자습서의 이 부분에서는 자동으로 생성된 Details
메서드와 Delete
메서드를 몇 가지 개선합니다. 이러한 변경은 필요하지 않지만 몇 가지 코드만 사용하면 애플리케이션을 쉽게 향상시킬 수 있습니다.
세부 정보 및 삭제 방법 개선
컨트롤러를 스캐폴드할 Movie
때 ASP.NET MVC는 잘 작동하지만 몇 가지 작은 변경만으로 더 강력하게 만들 수 있는 코드를 생성했습니다.
컨트롤러를 Movie
열고 동영상을 찾을 수 없는 경우 반환하여 HttpNotFound
메서드를 수정 Details
합니다. 또한 전달된 ID의 Details
기본값을 설정하도록 메서드를 수정해야 합니다. (이 자습서의 6부에서 메서드를 Edit
비슷한 방식으로 변경했습니다.) 그러나 메서드가 개체를 반환하지 않으므로 메서드 ActionResult
ViewResult
의 Details
반환 형식을 HttpNotFound
다른 형식으로 ViewResult
변경해야 합니다. 다음 예제에서는 수정된 Details
메서드를 보여줍니다.
public ActionResult Details(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Code First를 사용하면 메서드를 사용하여 데이터를 쉽게 검색할 수 있습니다 Find
. 메서드에 기본 제공된 중요한 보안 기능은 코드가 동영상으로 작업을 수행하기 전에 메서드가 동영상을 찾았는 것을 코드에서 확인 Find
한다는 것입니다. 예를 들어 해커는 링크에서 만든 URL을 http://localhost:xxxx/Movies/Details/1
에서 http://localhost:xxxx/Movies/Details/12345
(또는 실제 영화를 나타내지 않는 다른 값)와 같은 URL로 변경하여 사이트에 오류를 발생시킬 수 있습니다. null 동영상을 확인하지 않으면 데이터베이스 오류가 발생할 수 있습니다.
마찬가지로 ID 매개 변수의 Delete
기본값을 지정하고 동영상을 찾을 수 없을 때 반환 HttpNotFound
하도록 메서드와 DeleteConfirmed
메서드를 변경합니다. 컨트롤러의 업데이트 Delete
된 Movie
메서드는 다음과 같습니다.
// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
메서드는 Delete
데이터를 삭제하지 않습니다. GET 요청에 대한 응답에서 삭제 작업을 수행하는 것은(또는 해당 문제에 대한 편집 작업, 만들기 작업 또는 데이터를 변경하는 기타 작업을 수행하는 것은) 보안 허점을 야기합니다.
데이터를 삭제하는 HttpPost
메서드의 이름은 HTTP POST 메서드에 고유한 서명 또는 이름을 부여하기 위해 DeleteConfirmed
로 지정됩니다. 두 메서드의 서명은 다음과 같습니다.
// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
CLR(공용 언어 런타임)에는 오버로드된 메서드에 고유한 서명(동일한 이름, 다른 매개 변수 목록)이 있어야 합니다. 그러나 여기서는 두 개의 Delete 메서드(GET용 및 POST용 메서드)가 모두 동일한 서명이 필요합니다. (모두 매개 변수로 단일 정수를 허용해야 합니다.)
이를 정리하기 위해 몇 가지 작업을 수행할 수 있습니다. 하나는 메서드에 다른 이름을 지정하는 것입니다. 이것이 우리가 앞의 모범에서 한 일입니다. 그러나 이는 작은 문제를 가져옵니다. ASP.NET은 URL의 세그먼트를 이름으로 작업 메서드에 매핑하고 메서드의 이름을 바꾸면 정상적으로 라우팅하여 해당 메서드를 찾을 수 없게 됩니다. 솔루션은 예제에서 확인한 것으로, ActionName("Delete")
특성을 DeleteConfirmed
메서드에 추가하는 것입니다. 이렇게 하면 라우팅 시스템에 대한 매핑이 효과적으로 수행되므로 POST 요청에 대해 /Delete/for를 포함하는 URL이 메서드를 DeleteConfirmed
찾을 수 있습니다.
이름과 서명이 동일한 메서드의 문제를 방지하는 또 다른 방법은 사용되지 않는 매개 변수를 포함하도록 POST 메서드의 서명을 인위적으로 변경하는 것입니다. 예를 들어 일부 개발자는 POST 메서드에 전달되는 매개 변수 형식 FormCollection
을 추가한 다음 매개 변수를 사용하지 않습니다.
public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
요약
이제 SQL Server Compact 데이터베이스에 데이터를 저장하는 완전한 ASP.NET MVC 애플리케이션이 있습니다. 영화를 만들고, 읽고, 업데이트하고, 삭제하고, 검색할 수 있습니다.
이 기본 자습서에서는 컨트롤러를 만들고, 뷰와 연결하고, 하드 코딩된 데이터를 전달하기 시작했습니다. 그런 다음 데이터 모델을 만들고 디자인했습니다. Entity Framework Code First는 데이터 모델에서 데이터베이스를 즉시 만들었으며 ASP.NET MVC 스캐폴딩 시스템에서 기본 CRUD 작업에 대한 작업 메서드와 뷰를 자동으로 생성했습니다. 그런 다음 사용자가 데이터베이스를 검색할 수 있는 검색 양식을 추가했습니다. 새 데이터 열을 포함하도록 데이터베이스를 변경한 다음 이 새 데이터를 만들고 표시하도록 두 페이지를 업데이트했습니다. 데이터 모델을 네임스페이스의 특성 DataAnnotations
으로 표시하여 유효성 검사를 추가했습니다. 결과 유효성 검사는 클라이언트 및 서버에서 실행됩니다.
애플리케이션을 배포하려는 경우 먼저 로컬 IIS 7 서버에서 애플리케이션을 테스트하는 것이 유용합니다. 이 웹 플랫폼 설치 관리자 링크를 사용하여 ASP.NET 애플리케이션에 IIS 설정을 사용하도록 설정할 수 있습니다. 다음 배포 링크를 참조하세요.
이제 ASP.NET MVC 애플리케이션 및 MVC Music Store 자습서를 위한 중간 수준 엔터티 프레임워크 데이터 모델 만들기로 이동하여 MSDN에 대한 ASP.NET 문서를 탐색하고 MVC에 대한 자세한 내용을 알아보기 위해 많은 비디오 및 리소스 https://asp.net/mvc 를 확인하는 ASP.NET 것이 좋습니다. ASP.NET MVC 포럼은 질문하기에 좋은 장소입니다.
즐겨보세요!
— Scott Hanselman(http://hanselman.com 및 Twitter의 @shanselman )과 릭 앤더슨 이 blogs.msdn.com/rickAndy