다음을 통해 공유


자동으로 생성된 세부 정보 및 삭제 방법 검사

작성자: Rick Anderson

참고

이 자습서의 업데이트된 버전은 최신 버전의 Visual Studio를 사용하여 여기에서 사용할 수 있습니다. 새 자습서에서는 ASP.NET Core MVC를 사용하여 이 자습서에 비해 많은 개선 사항을 제공합니다.

이 자습서에서는 컨트롤러와 보기를 통해 ASP.NET Core MVC에 설명합니다. Razor Pages는 웹 UI를 더 쉽고 생산성을 높이는 페이지 기반 프로그래밍 모델인 ASP.NET Core 새로운 대안입니다. MVC 버전 이전의 Razor 페이지 자습서를 사용해 보는 것이 좋습니다. Razor 페이지 자습서:

  • 자습서 내용을 좀 더 쉽게 진행할 수 있습니다.
  • 더 많은 기능을 다룹니다.
  • 새 앱 개발에 선호되는 방법입니다.

자습서의 이 부분에서는 자동으로 생성된 및 Delete 메서드를 Details 검사합니다.

세부 정보 및 삭제 메서드 검사

컨트롤러를 Movie 열고 메서드를 검사합니다 Details .

영화 컨트롤러 점 c의 탭을 보여 주는 스크린샷 만들기 드롭다운 메뉴에서 세부 정보가 빨간색으로 동그라미를 친다.

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);
}

이 작업 메서드를 만든 MVC 스캐폴딩 엔진은 메서드를 호출하는 HTTP 요청을 보여 주는 주석을 추가합니다. 이 경우 GET 세 개의 URL 세그먼트, 컨트롤러, Movies 메서드 및 값이 Details 있는 요청입니다 ID .

Code First를 사용하면 메서드를 사용하여 데이터를 쉽게 검색할 수 있습니다 Find . 메서드에 기본 제공되는 중요한 보안 기능은 코드가 메서드가 Find 동영상으로 작업을 시도하기 전에 메서드가 동영상을 찾았는 것을 확인한다는 것입니다. 예를 들어 해커는 링크에서 만든 URL을 http://localhost:xxxx/Movies/Details/1에서 http://localhost:xxxx/Movies/Details/12345(또는 실제 영화를 나타내지 않는 다른 값)와 같은 URL로 변경하여 사이트에 오류를 발생시킬 수 있습니다. null 동영상에 대해 검사 않은 경우 null 동영상으로 인해 데이터베이스 오류가 발생합니다.

DeleteDeleteConfirmed 메서드를 검토합니다.

// 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");
}

HTTP GET Delete 메서드는 지정된 동영상을 삭제하지 않고 삭제를 제출(HttpPost)할 수 있는 동영상 보기를 반환합니다. GET 요청에 대한 응답에서 삭제 작업을 수행하는 것은(또는 해당 문제에 대한 편집 작업, 만들기 작업 또는 데이터를 변경하는 기타 작업을 수행하는 것은) 보안 허점을 야기합니다. 이에 대한 자세한 내용은 Stephen Walther의 블로그 항목 ASP.NET MVC 팁 #46 — 보안 허점을 만들기 때문에 링크 삭제를 사용하지 않음을 참조하세요.

데이터를 삭제하는 HttpPost 메서드의 이름은 HTTP POST 메서드에 고유한 서명 또는 이름을 부여하기 위해 DeleteConfirmed로 지정됩니다. 두 메서드의 서명은 다음과 같습니다.

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)

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");
}

요약

이제 로컬 DB 데이터베이스에 데이터를 저장하는 완전한 ASP.NET MVC 애플리케이션이 있습니다. 영화를 만들고, 읽고, 업데이트하고, 삭제하고, 검색할 수 있습니다.

M V C 무비 검색 인덱스 페이지를 보여 주는 스크린샷

다음 단계

웹 애플리케이션을 빌드하고 테스트한 후 다음 단계는 다른 사용자가 인터넷을 통해 사용할 수 있도록 하는 것입니다. 이렇게 하려면 웹 호스팅 공급자에 배포해야 합니다. Microsoft는 무료 Azure 평가판 계정으로 최대 10개의 웹 사이트에 대한 무료 웹 호스팅을 제공합니다. 다음에는 Azure에 Membership, OAuth 및 SQL Database 사용하여 보안 ASP.NET MVC 앱 배포 자습서를 따르는 것이 좋습니다. 훌륭한 자습서는 Tom Dykstra의 중간 수준 ASP.NET MVC 애플리케이션에 대한 Entity Framework 데이터 모델 만들기입니다. StackoverflowASP.NET MVC 포럼 은 질문하기에 좋은 장소입니다. twitter에서 를 팔로우하시면 최신 자습서 업데이트를 받으실 수 있습니다.

피드백은 환영합니다.

Rick Anderson twitter: @RickAndMSFT
Scott Hanselman twitter: @shanselman