페이지 라우팅(수정)


제가 좋아하는 MVP 중에 '정성태'씨가 있습니다. (http://www.sysnet.pe.kr/)

정성태씨 블로그에는 닷넷 관련 좋은 팁과 자료가 있어 자주 방문하는데요.

그런데 포스트글을 볼 때 아래와 같은 주소창으로 접근이 됩니다.

 http://www.sysnet.pe.kr/2/0/1404    (Hyper-V VM 복사는 robocopy 로.)

분명 GET방식도 아니고 xxx.aspx같은 페이지 접근도 아닌데 접근이 가능하더군요.

그래서 찾아 봤습니다.

Webform Routing이란 건데요. 특정 URL맵핑값을 웹어플리케이션이 시작할 때 등록시키는 방법입니다.

ASP.NET MVC에서는 프로젝트 생성 시 자동으로 Webform Routing을 해주는 부분이 포함되어 있습니다.

 

 하지만 ASP.NET 웹폼 프로젝트에는 없기 때문에 직접 만들어 줘야 합니다.

1. 프로젝트에서 우클릭 -> 추가(D) -> 새 항목(W)...
 

2. 설치된 템플릿 / Visual C# -> 웹 -> 전역 응용 프로그램 클래스 선택 -> 이름 Global.asax ( 기본값입니다. 보통 이름을 Global을 사용하니 그대로 사용합니다.) 참고로 전역 응용 프로그램 클래스는 프로젝트당 1개만 만들 수 있습니다.
 

3. 다시 2.번 화면으로 가서 이름을 test1로 웹 폼을 추가 시킵니다.
 

4. 자 그러면 Global.asax파일과 test1.aspx 파일이 생겼습니다. Global.aspx.cs(코드비하인드파일) 파일을 열어 아래와 같이 작성합니다.
첫 번째 매개변수는 라우팅 맵의 이름(유일한값)이고 두 번째는 URL 요청 형식입니다. 세 번째 인자는 라우팅 할 실제 페이지입니다. 반드시 가상경로만 가능합니다.
아래의 코드를 해석하면 다음과 같습니다. 주소/Contact/Details/krinlion으로 접속(요청)하면 test1페이지로 id=krinlion으로 전달 하겠다.
이제 주소창에 http://주소/Contacts/Details/krinlion 이라고 입력하면 라우팅 테이블에 의해 test1.aspx로 이동하게 됩니다.
 protected void Application_Start(object sender, EventArgs e) // 웹 어플리케이션이 시작할 때 실행되는 이벤트 처리기
  {
   RegisterRoutes(RouteTable.Routes);
  }

  void RegisterRoutes(RouteCollection routes) // 라우터 테이블을 추가/관리하는 메서드
  {
   routes.MapPageRoute(
     "Contact_Details",                  // Route Name
     "Contacts/Details/{id}",         // Url and Parameters
     "~/test1.aspx"                      // Page Handling Request
     );
  }

TIP) MSDN 도움말
라우터 테이블에서 해당 요청URL와 같은 형태의 경로를 찾아내면 나머지 경로에 대해서는 확인 하지 않기 때문에 같은 형식의 경로+파라미터를 라이터 테이블에 추가한다면 순서에 유의해야 한다.
  ASP.NET 응용 프로그램이 요청을 처리할 때 응용 프로그램은 Routes 속성의 경로 컬렉션을 반복하여 URL 요청 형식과 일치하는 경로를 찾아냅니다.응용 프로그램은 URL과 일치하는 컬렉션에서의 첫 번째 경로를 사용하므로 Routes 속성에 추가하는 경로의 순서가 중요합니다.

5. 이제 주소창에 Contacts/Details/krinlion으로 했을 때 test1.aspx로 라우팅이 잘 되는지와 test1.aspx 페이지로 값이 잘 전달되는지를 확인해야겠네요.
전달받은 인자를 확인 하기 위해 test1.aspx.cs(코드비하인드파일)에 아래와 같이 전달받은 인자를 출력하는 코드를 넣습니다.
라이팅에 의해 전달된 파라미터는 POST/GET 방식으로 전달 된 값이 아니기 때문에
this.Request.Form["id"] or this.Page.Request["id"]로 값을 가져올 수 없습니다. 그래서 아래와 같이 this.Page.RouteData.Values["id"].ToString()를 사용하여 값을 가져와 처리 합니다.
 public partial class test1 : System.Web.UI.Page
 {
      protected void Page_Load(object sender, EventArgs e)
      {
           Response.Write(String.Format("전달 된 값은 : {0} 입니다.", this.Page.RouteData.Values["id"].ToString()));
      }
 }

6. 확인
아래와 같이 주소창에 페이지 확장명이 없고 해당 페이지에서는 값이 잘 전달된 것을 확인 할 수 있습니다.
 




Previous
Next Post »