ASP.NET MVC 에서 요청 매개변수 넘기기

Posted in .NET Framework // Posted at 2010.08.05 13:39

이전 ASP나 ASP.NET 웹폼 모델에서는 URL의 꼬리표에 붙여 있는 매개변수를
Request 객체를 통해전달 받을 수 있었다

즉 다음과 같이 두 개의 매개변수를 URL 에 붙여서 매개변수를 전달하게 되면,
요청 URL: http://yourdomain/main.aspx?param1=value1&param2=value2

아래처럼 매개변수 정보를 취할 수 있다(ASP.NET 기준)
string value1 = Request.QueryString["param1"].ToString();
string value2 = Request.QueryString["param2"].ToString();

그렇다면 ASP.NET MVC 모델에서는 매개변수를 어떻게 전달하고 받는지 알아보도록 하자

기본은 동일하다
ASP.NET MVC 역시 이전 웹폼 모델과 동일한 형태로 매개변수를 넘기고 받을 수 있다

즉 아래와 같이 요청 URL 에 ? 꼬리표로 매개변수를 전달하면
HomeController 의 Index 액션 메서드에서 다음과 같이 매개변수에 접근할 수 있게 된다

요청 URL: http://localhost:11102/Home/Index/?name=Park&age=10

public
ActionResult Index()
{
    string name = Request.QueryString["name"].ToString();
   string age = Request.QueryString["age"].ToString(); 

    ViewData["param"] = String.Format("Hello, {0}, Your age {1}", name, age);

    return View();
}


액센메서드의 매개변수로 전달 받기
URL 에 포함되어 있는 매개변수를 액션 메서드의 매개변수로 전달 받을 수도 있다
아래 코드는 Index 매개변수를 통해 URL로 전달되는 매개변수를 전달 받고 있다


요청 URL: http://localhost:11102/Home/Index/?name=Park&age=10

public
ActionResult Index(string name, string age)

{

    ViewData["param"] = String.Format("Hello, {0}, Your age {1}", name, age);

    return View();

}

액션 메서드를 통해 매개변수를 전달 받는 것은 ASP.NET MVC 프레임워크에서 제공해 주는 기능이며
이전 형태 보다는 조금 더 ASP.MVC 스럽다고 할 수 있겠다

액션 메서드로 매개변수를 전달 받을 경우 URL 에 정의된 매개변수 명과 액션메서드에 정의된
매개변수 명이 동일해야 한다는 규칙이 있다(순서는 상관 없다. 변수 이름이 중요하다)



참고로 URL 에 매개변수가 있다고 해서 반드시 액션 메서드에 매개변수를 정의 해야 하는 것은 아니다
그리고 그 반대의 경우, 즉 액션메서드에 매개변수가 정의 되었다고 해서 반드시 URL에 매개변수를 넘겨야 하는 것은 아니다 (물론 이 두 경우는 매개변수를 사용하지 않을 경우이다)

예를 들어 URL 에 매개변수가 생략되었을 경우 액션메서드로는 null 을 전달하게 될 것이다


URL 스키마 사용자 정의
앞서 Request.QueryString 으로 매개변수를 가져오는 방식에 비해 액션 메서드의 매개변수로 가져오는 것이 보다 깔끔하고 직관적이라는하다는 것을 느낄 수 있다.
이것은 매개변수를 가져오는 측면에서 ASP.NET MVC 가 지원해 주는 부분이 되겠다

이번에는 매개변수를 전달하는 측면에서의 ASP.MVC 의 장점을 살펴 보자

앞서 요청 URL은 다음과 같은 스키마로 이루어 졌었다
http://localhost:11102/Home/Index/?name=Park&age=10

전통적인 방식으로 URL에 ? 꼬리표를 통해 매개변수를 전달하고 있다
우리는 이러한 요청 URL을 보다 깔끔하게 변경하고 싶다

ASP.NET MVC 에서는 URL 스키마를 개발자의 입맛대로(?) 재 구성할 수 있는 방법을 제공해 준다.

이는 ASP.NET MVC의 라우팅 엔진이 제공해 주는 기능인데,
Global.asax 의 RegisterRoutes 메서드의 커스트마이징을 통해 구현할 수 있다

우선 매개변수를 어떤 형태의 URL 스키마로  정의할 지 결정해야 하는데,
다음과 같이 '/(슬래쉬)'를 계속 이어가고 싶다고 가정해 보자

http://localhost:11102/Home/Index/매개변수1/매개변수2

이와 같은 URL 스키마를 실현하기 위해 Global.asax 파일에 정의된
RegisterRoutes 메서드를 약간 수정해 보자

public static void RegisterRoutes(RouteCollection routes)

{

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

    routes.MapRoute(

        "Default",

 

        "{controller}/{action}/{name}/{age}", // URL with parameters

 

              new { controller = "Home", action = "Index",

name = UrlParameter.Optional,

                         age = UrlParameter.Optional }

  );

}


MapRoute 메서드의 두 번째 정보에 URL 스키마를 정의한다
우리가 결정한 URL 스키마를 실현하기 위해 /(슬래시)로 매개변수를 취할 수있도록 하였다
컨트롤러/액션메서드/name매개변수/age매개변수 형태로 정의함
=> "{controller}/{action}/{name}/{age}"


그리고 다음과 같이 각 매개변수의 옵션 여부를 지정하였다
이는 name, age 정보가 URL에서 생략될 수 있다는 의미이다
name = UrlParameter.Optional, 
age = UrlParameter.Optional

이제 구성이 완료 되었으니 다음과 같은 요청에 정상적으로 반응하게 될 것이다
http://localhost:11102/Home/Index/Park/10


만일 다음과 같은 URL을 원한다면,
http://localhost:11102/Home/Index/Park-10

다음과 같이 정의하면 된다
"{controller}/{action}/{name}-{age}"

참고로 이런 식으로 URL 스키마 재정의로 매개변수 정보를 구성하였다면,
더 이상 Request.QueryString 로 받을 수 없다는 것에 주의하자
-----------------------------------------------------------------------------------

마지막으로 URL 재구성된 상태에서 전통적인 ? 매개변수 전달을 같이 혼용하면 어떻게 될까?
다시 말해 다음과 같은 URL 요청은 어떻게 되는지 살펴 보자

요청 URL: http://localhost:11102/Home/Index/Park/10?name=Kim&age=20

액션메서드:
public
ActionResult Index(string name, string age)

{

    ViewData["param"] = String.Format("Hello, {0}, Your age {1}", name, age);

    return View();

}

이를 경우 URL 로 재구성된 매개변수 정보가 먼저 참조 된다
즉 URL 요청으로 부터 전달되는 name, age 라는 매개변수가 각각 두 개씩 이지만
URL 재구성에 의한 name=Park, age = 10 이 전달되는 것이다

그러나 만일 URL 스키마에서 매개변수 정보를 생략하고 다음과 같이 요청 된다면,
http://localhost:11102/Home/Index/?name=Kim&age=20

결과는 ?  매개변수가 전달되게 된다

ASP.NET MVC 는 라우팅 구성 정보에 의거한 적절한 매개변수를 가져올 수 없는 경우
전통적인 ? 질의 문자열에서 매개변수를 가져오게 되는 것이다

submit