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이다.

 

+ Recent posts