
HomeController.cs는 프로젝트 생성 시 기본 생성된 홈컨트롤러고,
HelloWorldController.cs는 튜토리얼을 따라 만든 컨트롤러다.
각 파일들의 코드는 다음과 같다.
HomeCpontroller.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcMovie.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
}
HelloWorldController.cs
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...";
}
}
}
뭔가 명시된 경로가 없다??????????
이는 다음 경로에 정의되어있다.

App_Start/RouteConfig.cs의 파일 내용 중 다음과 같은 코드가 있다.
namespace MvcMovie
{
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 }
);
}
}
}
(namespace는 자바의 package에 해당한다)
라우터를 다음과 같이 작동하도록 설정되어있다.
/[Controller]/[ActionName]/[Parameters]
그리고 미리 설명하자면
1 ) Index는 URL 입력 시 / 만 입력해도 들어가는 기본 경로로 지정되도록 되어있다.
2 ) 각 Controller의 이름은 'ㅇㅇㅇController'에서 'Controller'를 떼어낸 'ㅇㅇㅇ'만 해당된다.
3 ) 예외적으로 HomeController의 Index는 경로를 모두 생략시 최상위 URL 경로로 잡는다.
즉, HomeController의 Index 액션에 해당하는 URL 주소는
localhost:포트번호/
localhost:포트번호/home/
localhost:포트번호/home/index
3개에 매칭된다. (localhost:포트번호/index는 컨트롤러 이름을 생략해버려서 불가능하다. 즉, localhost:포트번호/ 이것만 예외인 경우다. 그 이유는 route.MapRoute에 defaults를 home/index로 정의해 놓았으니까!!!)
마찬가지로 HomeController의 About 액션에 해당하는 URL 주소는
localhost:포트번호/home/about
하나에 매칭된다.
마찬가지로, HelloWorldController의 Index 액션에 해당하는 URL 주소는
localhost:포트번호/helloworld/
localhost:포트번호/helloworld/index
2개에 매칭되고
HelloWorldController의 Welcome 액션에 해당하는 URL 주소는
localhost:포트번호/helloworld/welcome
하나에 매칭된다.
RouteConfig.cs에 들어올 파라미터를 미리 정의하기
일반적으로 GET방식 파라미터는 ? 뒤에 key-value 형태로 들어온다. 그 경우는 다음과 같다.
public string Welcome(string name, int ID = 1) {
return HttpUtility.HtmlEncode("Hello " + name + ", ID is: " + ID);
}
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
즉, id라는 파라미터는 정의되어 있으나 optional이고, name은 파라미터를 써서 던져줘야한다.
그런데 라우터를 아래와 같이 하나를 더 추가하면
routes.MapRoute(
name: "Hello",
url: "{controller}/{action}/{name}/{id}"
);
이 경우 파라미터의 순서가 중요하다. ? 뒤에 파라미터를 직접 넣어줄 때는 순서가 필요 없지만 위에처럼 정의하면 아래와 같은 URL을 컨트롤러에 의해 ?뒤에 오는 파라미터가 아님에도 URL path 자체를 파라미터로 인식한다.
localhost:포트번호/helloworld/welcome/Tree/22
이런 URL을 원래대로라면 22까지 모두 path로 읽어야 하지만 welcome까지만 path로 읽고, Tree와 22는 각각 name=Tree, id=22라는 파라미터로 인식한다.
물론, 이렇게 라우터를 정의했더라도 ? 뒤에 파라미터를 직접 정의해 URL을 보낼 경우 Default 라우터에 의해 기존대로 잘 작동한다.
참고 : 라우터의 name은 식별하기 위한 것이지 동작에 영향을 주지 않는다. 영향을 주는 것은 url이다.
'개발자 > .NET' 카테고리의 다른 글
C# (C Sharp) Visual Studio 기본 생성 클래스 public으로 만들기 (0) | 2021.01.25 |
---|---|
C# (C Sharp) .NET5 MVC(View) Razor pages & @RenderBody() (0) | 2021.01.25 |
Visual Studio for Windows 단축키 변경 (0) | 2021.01.24 |
C# (C Sharp) Interface (인터페이스 추상화) 자바와 차이 (0) | 2021.01.22 |
C# (C Sharp) Abstract class, Abstract method (0) | 2021.01.22 |