세부 정보 및 삭제 메서드 개선(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 Web Developer 2010 대신 Visual Studio 2010을 사용하는 경우 Visual Studio 2010 필수 구성 요소 링크를 클릭하여 필수 구성 요소를 설치합니다.

C# 소스 코드가 포함된 Visual Web Developer 프로젝트는 이 항목과 함께 사용할 수 있습니다. C# 버전을 다운로드합니다. Visual Basic을 선호하는 경우 이 자습서의 Visual Basic 버전으로 전환합니다.

자습서의 이 부분에서는 자동으로 생성된 DetailsDelete 메서드를 몇 가지 개선합니다. 이러한 변경은 필요하지 않지만 몇 가지 작은 코드만으로 애플리케이션을 쉽게 향상시킬 수 있습니다.

세부 정보 및 삭제 방법 개선

컨트롤러를 Movie 스캐폴드할 때 ASP.NET MVC는 잘 작동하지만 몇 가지 작은 변경만으로 더 강력하게 만들 수 있는 코드를 생성했습니다.

컨트롤러를 Movie 열고 동영상을 찾을 수 없을 때 를 반환하여 HttpNotFound 메서드를 수정 Details 합니다. 또한 메서드를 Details 수정하여 전달된 ID의 기본값을 설정해야 합니다. (이 자습서의 6부에서 메서드를 Edit 비슷한 방식으로 변경했습니다.) 그러나 메서드가 개체를 반환하지 ViewResult 않으므로 메서드의 Details 반환 형식을 HttpNotFound 에서 ActionResultViewResult 로 변경해야 합니다. 다음 예제에서는 수정된 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 동영상에 대한 검사 않으면 데이터베이스 오류가 발생할 수 있습니다.

마찬가지로 및 DeleteConfirmed 메서드를 Delete 변경하여 ID 매개 변수의 기본값을 지정하고 동영상을 찾을 수 없을 때 를 반환 HttpNotFound 합니다. 컨트롤러의 업데이트 DeleteMovie 메서드는 다음과 같습니다.

// 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 요청에 대한 응답에서 삭제 작업을 수행하는 것은(또는 해당 문제에 대한 편집 작업, 만들기 작업 또는 데이터를 변경하는 기타 작업을 수행하는 것은) 보안 허점을 야기합니다. 이에 대한 자세한 내용은 Stephen Walther의 블로그 항목 ASP.NET MVC 팁 #46 — 보안 허점을 만들기 때문에 링크 삭제를 사용하지 않음을 참조하세요.

데이터를 삭제하는 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/를 포함하는 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 애플리케이션이 있습니다. 영화를 만들고, 읽고, 업데이트하고, 삭제하고, 검색할 수 있습니다.

M V C 동영상 앱의 검색 인덱스 페이지를 보여 주는 스크린샷 페이지에는 4개의 영화 목록이 표시됩니다.

이 기본 자습서에서는 컨트롤러를 만들고, 뷰와 연결하고, 하드 코딩된 데이터를 전달하기 시작했습니다. 그런 다음 데이터 모델을 만들고 디자인했습니다. Entity Framework Code 먼저 데이터 모델에서 데이터베이스를 즉시 만들었으며 ASP.NET MVC 스캐폴딩 시스템에서 기본 CRUD 작업에 대한 작업 메서드와 뷰를 자동으로 생성했습니다. 그런 다음 사용자가 데이터베이스를 검색할 수 있는 검색 양식을 추가했습니다. 새 데이터 열을 포함하도록 데이터베이스를 변경한 다음 이 새 데이터를 만들고 표시하도록 두 페이지를 업데이트했습니다. 데이터 모델을 네임스페이스의 특성 DataAnnotations 으로 표시하여 유효성 검사를 추가했습니다. 결과 유효성 검사는 클라이언트 및 서버에서 실행됩니다.

애플리케이션을 배포하려는 경우 먼저 로컬 IIS 7 서버에서 애플리케이션을 테스트하는 것이 유용합니다. 이 웹 플랫폼 설치 관리자 링크를 사용하여 ASP.NET 애플리케이션에 IIS 설정을 사용하도록 설정할 수 있습니다. 다음 배포 링크를 참조하세요.

이제 중간 수준 MVC 애플리케이션 및 MVC Music Store 자습서를 위한 엔터티 프레임워크 데이터 모델 만들기 자습서로 이동하여 MSDN에 ASP.NET 대한 ASP.NET 문서를 탐색하고, MVC를 ASP.NET 대한 자세한 내용을 알아보려면 에서 https://asp.net/mvc 많은 비디오 및 리소스를 검사 것이 좋습니다. ASP.NET MVC 포럼은 질문하기에 좋은 장소입니다.

즐겨보세요!

— Scott Hanselman(http://hanselman.com Twitter의 @shanselman ) 및 Rick Anderson blogs.msdn.com/rickAndy