다음을 통해 공유


새 컨트롤러 추가

작성자: Rick Anderson

메모

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

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

  • 따라하기 쉽습니다.
  • 더 많은 기능을 다룹니다.
  • 새 앱 개발을 위한 기본 접근 방식입니다.

MVC는 model-view-controller를 의미합니다. MVC는 잘 설계되고 테스트 가능하며 유지 관리하기 쉬운 애플리케이션을 개발하기 위한 패턴입니다. MVC 기반 애플리케이션에는 다음이 포함됩니다.

  • M odels: 애플리케이션의 데이터를 나타내고 유효성 검사 논리를 사용하여 해당 데이터에 대한 비즈니스 규칙을 적용하는 클래스입니다.
  • V iews: 애플리케이션이 HTML 응답을 동적으로 생성하는 데 사용하는 템플릿 파일입니다.
  • C ontrollers: 들어오는 브라우저 요청을 처리하고, 모델 데이터를 검색한 다음, 브라우저에 응답을 반환하는 뷰 템플릿을 지정하는 클래스입니다.

이 자습서 시리즈에서는 이러한 모든 개념을 다루고 이를 사용하여 애플리케이션을 빌드하는 방법을 보여 줍니다.

먼저 컨트롤러 클래스를 만들어 보겠습니다. 솔루션 탐색기에서 Controllers 폴더를 마우스 오른쪽 단추로 클릭한 다음 추가, 컨트롤러를 차례로 클릭합니다.

솔루션 탐색기 창을 보여 주는 스크린샷. 컨트롤러가 마우스 오른쪽 단추로 클릭하고 하위 추가 메뉴가 열립니다.

스캐폴드 추가 대화 상자에서 MVC 5 컨트롤러 - 비어 있는 것을 클릭한 다음 추가를 클릭합니다.

스캐폴드 추가 대화 상자를 보여주는 스크린샷입니다. M V C 5 컨트롤러 (비어 있음)이 선택되었습니다.

새 컨트롤러 이름을 "HelloWorldController"로 지정하고 추가를 클릭합니다.

컨트롤러 추가

솔루션 탐색기에서 새 파일 이름이 HelloWorldController.cs 및 새 폴더 Views\HelloWorld를 만들었습니다. 컨트롤러가 IDE에서 열려 있습니다.

Hello World Controller dot c 탭이 열려 있는 것을 보여 주는 스크린샷 솔루션 탐색기에서 Hello World 컨트롤러 점 c의 하위 폴더와 Hello World 하위 폴더가 빨간색 원으로 표시됩니다.

파일의 내용을 다음 코드로 바꿉니다.

using System.Web;
using System.Web.Mvc; 
 
namespace MvcMovie.Controllers 
{ 
    public class HelloWorldController : Controller 
    { 
        // 
        // GET: /HelloWorld/ 
 
        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 
 
        // 
        // GET: /HelloWorld/Welcome/ 
 
        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } 
}

컨트롤러 메서드는 HTML 문자열을 예제로 반환합니다. 컨트롤러의 이름이 지정 HelloWorldController 되고 첫 번째 메서드의 이름이 지정 Index됩니다. 브라우저에서 호출해 보겠습니다. 애플리케이션을 실행합니다(F5 또는 Ctrl+F5 누름). 브라우저에서 주소 표시줄의 경로에 "HelloWorld"를 추가합니다. (예를 들어 아래 http://localhost:1234/HelloWorld.그림에서는 다음과 같습니다.) 브라우저의 페이지는 다음 스크린샷과 같습니다. 위의 메서드에서 코드는 문자열을 직접 반환했습니다. 당신은 시스템에게 HTML을 반환하라고 했더니, 시스템이 그렇게 했습니다!

창에서 내 기본 작업이라는 텍스트가 있는 로컬 호스트 탭을 보여 주는 스크린샷.

ASP.NET MVC는 들어오는 URL에 따라 다른 컨트롤러 클래스(및 해당 클래스 내의 다른 작업 메서드)를 호출합니다. ASP.NET MVC에서 사용하는 기본 URL 라우팅 논리는 다음과 같은 형식을 사용하여 호출할 코드를 결정합니다.

/[Controller]/[ActionName]/[Parameters]

App_Start/RouteConfig.cs 파일에서 라우팅 형식을 설정합니다.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

애플리케이션을 실행하고 URL 세그먼트를 제공하지 않으면 기본값은 "Home" 컨트롤러와 위의 코드의 기본 섹션에 지정된 "Index" 작업 메서드로 설정됩니다.

URL의 첫 번째 부분에서는 실행할 컨트롤러 클래스를 결정합니다. 따라서 /HelloWorld 는 클래스에 매핑합니다 HelloWorldController . URL의 두 번째 부분에서는 실행할 클래스의 작업 메서드를 결정합니다. 따라서 /HelloWorld/Index로 인해 클래스의 메서드가 IndexHelloWorldController 실행됩니다. /HelloWorld로만 이동하면 되며 메서드가 Index 기본적으로 사용되었습니다. 이는 명명 Index 된 메서드가 명시적으로 지정되지 않은 경우 컨트롤러에서 호출되는 기본 메서드이기 때문입니다. URL 세그먼트(Parameters)의 세 번째 부분은 경로 데이터입니다. 이 자습서의 뒷부분에서 경로 데이터를 볼 수 있습니다.

http://localhost:xxxx/HelloWorld/Welcome로 이동합니다. Welcome 메서드는 "이것은 환영 작업 메서드입니다..."라는 문자열을 반환합니다. 기본 MVC 매핑은 .입니다 /[Controller]/[ActionName]/[Parameters]. 이 URL의 경우 컨트롤러는 HelloWorld이고 Welcome이 작업 메서드입니다. 아직 URL의 [Parameters] 부분을 사용하지 않았습니다.

창에 '이것은 환영 작업 메서드입니다.'라는 텍스트가 있는 로컬 호스트 탭을 보여주는 스크린샷

URL에서 컨트롤러로 일부 매개 변수 정보를 전달할 수 있도록 예제를 약간 수정해 보겠습니다(예: /HelloWorld/Welcome?name=Scott&numtimes=4). Welcome 아래와 같이 두 개의 매개 변수를 포함하도록 메서드를 변경합니다. 코드는 C# 선택적 매개 변수 기능을 사용하여 해당 매개 변수에 대한 값이 numTimes 전달되지 않으면 매개 변수가 기본값인 1로 지정되어야 함을 나타냅니다.

public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

메모

보안 참고: 위의 코드는 HttpUtility.HtmlEncode 를 사용하여 악의적인 입력(즉, JavaScript)으로부터 애플리케이션을 보호합니다. 자세한 내용은 방법: 문자열에 HTML 인코딩을 적용하여 웹 애플리케이션의 스크립트 악용으로부터 보호

애플리케이션을 실행하고 예제 URL(http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4)로 이동합니다. URL에서 namenumtimes의 다른 값을 시도할 수 있습니다. ASP.NET MVC 모델 바인딩 시스템은 주소 표시줄에 있는 쿼리 문자열의 명명된 매개 변수를 메서드의 매개 변수에 자동으로 매핑합니다.

U R L 로컬 호스트 콜론 1 2 3 4 슬래시 Hello World 슬래시 시작 물음표 이름이 Scott과 같고 num 시간이 4인 브라우저 창을 보여주는 스크린샷. 창의 텍스트는 Hello Scott Num Times가 4입니다.

위의 샘플에서는 URL 세그먼트()가 Parameters사용되지 않고 매개 name 변수와 numTimes 매개 변수가 쿼리 문자열로 전달됩니다. 그 ? 위 URL의 (물음표)는 구분 기호이며 쿼리 문자열은 다음과 같습니다. > 문자는 쿼리 문자열을 구분합니다.

Welcome 메서드를 다음 코드로 바꿉다.

public string Welcome(string name, int ID = 1)
{
    return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}

애플리케이션을 실행하고 다음 URL을 입력합니다. http://localhost:xxx/HelloWorld/Welcome/1?name=Scott

U R L 로컬호스트 콜론 1 2 3 4 슬래시 Hello World 슬래시 Welcome 슬래시 1 물음표 name=Scott와 같은 브라우저 창을 보여주는 스크린샷. 창에 표시된 텍스트는 Hello Scott ID 1입니다.

이번에는 세 번째 URL 세그먼트가 경로 매개 변수 ID.Welcome 와 일치합니다. 작업 메서드는 메서드의 URL 사양 ID 과 일치하는 매개 변수(RegisterRoutes)를 포함합니다.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

ASP.NET MVC 애플리케이션에서는 매개 변수를 쿼리 문자열로 전달하는 것보다 매개 변수를 경로 데이터로 전달하는 것이 더 일반적입니다(위의 ID와 같이). URL에서 namenumtimes를 매개 변수로 경로 데이터로 전달하는 경로를 추가할 수 있습니다. App_Start\RouteConfig.cs 파일에서 "Hello" 경로를 추가합니다.

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

      routes.MapRoute(
           name: "Hello",
           url: "{controller}/{action}/{name}/{id}"
       );
   }
}

애플리케이션을 실행하고 /localhost:XXX/HelloWorld/Welcome/Scott/3로 이동합니다.

U R L localhost 콜론 1 2 3 4 슬래시 Hello World 슬래시 Welcome 슬래시 Scott 슬래시 3 브라우저 창이 표시된 스크린샷. 창의 텍스트는 Hello Scott ID 3입니다.

많은 MVC 애플리케이션의 경우 기본 경로가 정상적으로 작동합니다. 이 자습서의 뒷부분에서 모델 바인더를 사용하여 데이터를 전달하는 방법을 알아보고 기본 경로를 수정할 필요가 없습니다.

이러한 예제에서 컨트롤러는 MVC의 "VC" 부분, 즉 보기 및 컨트롤러가 작동합니다. 컨트롤러가 HTML을 직접 반환하고 있습니다. 일반적으로 컨트롤러가 HTML을 직접 반환하는 것을 원하지 않습니다. 이는 코드에 매우 번거롭기 때문에입니다. 대신 일반적으로 HTML 응답을 생성하는 데 도움이 되도록 별도의 보기 템플릿 파일을 사용합니다. 다음으로 이 작업을 수행하는 방법을 살펴보겠습니다.