세부 정보 및 삭제 작업 메서드 검사
작성자: Rick Anderson
참고 항목
이 자습서의 업데이트된 버전은 ASP.NET MVC 5 및 Visual Studio 2013을 사용하는 여기에서 사용할 수 있습니다. 더 안전하고 훨씬 더 간단하게 팔로우할 수 있으며 더 많은 기능을 보여 줍니다.
자습서의 이 부분에서는 자동으로 생성된 메서드와 Delete
메서드를 Details
검사합니다.
세부 정보 및 삭제 메서드 검사
컨트롤러를 Movie
열고 메서드를 검사합니다 Details
.
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 동영상이 데이터베이스 오류가 발생합니다.
Delete
및 DeleteConfirmed
메서드를 검토합니다.
// 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 요청에 대한 응답에서 삭제 작업을 수행하는 것은(또는 해당 문제에 대한 편집 작업, 만들기 작업 또는 데이터를 변경하는 기타 작업을 수행하는 것은) 보안 허점을 야기합니다.
데이터를 삭제하는 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/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");
}
요약
이제 로컬 DB 데이터베이스에 데이터를 저장하는 완전한 ASP.NET MVC 애플리케이션이 있습니다. 영화를 만들고, 읽고, 업데이트하고, 삭제하고, 검색할 수 있습니다.
다음 단계
웹 애플리케이션을 빌드하고 테스트한 후 다음 단계는 다른 사용자가 인터넷을 통해 사용할 수 있도록 하는 것입니다. 이렇게 하려면 웹 호스팅 공급자에 배포해야 합니다. Microsoft는 무료 Windows Azure 평가판 계정으로 최대 10개의 웹 사이트에 대한 무료 웹 호스팅을 제공합니다. 다음 자습서 에 따라 Membership, OAuth 및 SQL Database를 사용하여 보안 ASP.NET MVC 앱을 Windows Azure 웹 사이트에 배포하는 것이 좋습니다. 훌륭한 자습서는 ASP.NET MVC 애플리케이션에 대한 Entity Framework 데이터 모델을 만드는 Tom Dykstra의 중간 수준입니다. Stackoverflow 및 ASP.NET MVC 포럼 은 질문하기에 좋은 장소입니다. twitter에서 저를 팔로우하시면 최신 자습서 업데이트를 받으실 수 있습니다.
피드백은 환영합니다.
— Rick Anderson twitter: @RickAndMSFT
— Scott Hanselman twitter: @shanselman