ASP.NET MVC Routing
블로그나 카페등에서 사용되는 확장자 없는 URL을 자유롭게 설정해 주는 기능
Global.asax에서 routes.MapRoute() 메소드를 통해 매핑규칙을 추가하면
http://www.mnstime.com/microsoft/aspnet/mvc/routing 와 같은 URL이 가능하다는 것이다.
Routing은 Global.asax에서 설정을 한다.
Global.asax의 소스를 보면 다음과 같다.
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
프로젝트를 생성하면 Global.asax에 기본 routes.MapRoute() 이 설정되어 있다.
만약 URL로 /Home/Detail/10 로 요청이 들어오면 "{controller}/{action}/{id} 순으로
Controller |
Home Controller |
Action |
Detail Method |
Id |
10 ( 5 Parameter ) |
이렇게 매핑이 된다.
이 매핑의 규칙은 Global.asax에서 routes.MapRoute() 통해 다양하게 설정할 수 있다.
URL 요청은 순서대로 다양하게 설정한 routes.MapRoute() 중에서 적용이 되는 제일 첫번째 설정으로 매핑이 된다.
Default Routing
MVC의 URL에 대한 Default Routing 다음과 같다.
Global.asax.cs routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); |
다음은 URL에 대한 요청 설명이다.
http://localhost/ 라면 Paramter defaults로 인해 Home Controller의 Index Method를 호출한다.
http://localhost/Shop/List/ 라면 Shop Controller의 List Method가 호출된다.
http://localhost/Shop/List/1 라면 Shop Controller의 List Method에 1값이 파라메터로 전달이 된다.
Customer Routing
Routing은 기본적으로 {controller}/{action}/{id} 형태로 구성되지만 다른 형태로 구성 할 수 있다.
Global.asax.cs routes.MapRoute( "Plan", // Route name "Plan/{action}/{id}", // URL with parameters new { controller = "Plan", action = "List", id = "" } // Parameter defaults ); |
PlanMgt Controller의 View Method에 2값이 파라메터로 전달이 되며 /Plan의 View.aspx를 호출한다.
그리고 List.aspx 뷰가 만들어져야 http://localhost/Plan/ 를 요청했을 경우 List.aspx가 호출이 된다.
Global.asax.cs routes.MapRoute( "ShopProduct", // Route name "Shop/{controller}/{action}/{id}", // URL with parameters new { controller = "Product", action = "Index", id = "" }, // Parameter defaults new { controller = "(Product)|(Product2)" } ); |
※ 중요
Route를 여러개 지정하여 사용할 경우 위에서부터 차례대로 해석하는데 Default Route이 최상단으로 올리는 경우 Default Route에서 URL을 해석하여 페이지 에러가 발생하게 된다.
Customer Route를 생성했을 경우에는 먼저 Customer Route를 넣어준 후 Default Route를 넣어주는게 좋은 방법이다.
URL로 Controller 찾기
기본으로 Product Controller의 Index Method를 호출하여 /Product의 Index.aspx를 호출한다.
http://localhost/Shop/Product2/
Product2 Controller의 Index Method를 호출하여 /Product의 Index.aspx를 호출한다.
http://localhost/Shop/Product3/
Product3 Controller가 존재하지 않아 오류가 발생한다.
URL로 Parameter 전달하기
http://localhost/Shop/Product/Index/Hello
Controller의 Index Method에 Hello파라메터값을 전달하여 Index.aspx를 호출한다.
값의 전달을 위해 소스를 아래와 같이 수정하였다.
ProductController.cs public ActionResult Index(string id) { ViewData["ProductParam"] = id; return View(); } |
Index.aspx <%=Html.Encode(ViewData["ProductParam"]) %> |
간단하게 하나의 파라메터 값을 전달하였다.
응용해서 2개의 파라메터를 전달하려면 어떻게 해야 할까?
http://localhost:7002/Shop/Product/Index/Hello/Hi
Global.asax.cs routes.MapRoute( "ShopProduct", // Route name "Shop/{controller}/{action}/{id}/{id2}", // URL with parameters new { controller = "Product", action = "Index", id = "", id2 = "" }, // Parameter defaults new { controller = "(Product)|(Product2)" } ); |
ProductController.cs public ActionResult Index(string id , string id2) { ViewData["ProductParam"] = id; ViewData["ProductParam2"] = id2; return View(); } |
Index.aspx <%=Html.Encode(ViewData["ProductParam"]) %> / <%=Html.Encode(ViewData["ProductParam2"]) %> |
Views에 Win Form 추가하기
지금까지는 그림에서 처럼 Views/Product에 View 항목을 통해 Page를 추가했다.
지금은 새 항목을 통하여 Web Form을 추가하는 것을 해보겠다.
새 항목을 클릭 후 Web Form 선택하여 Detail.aspx라는 Web Form을 만들자.
다음으로 Product Controller에 Detail Action을 만들어 연결을 해보자
Product Controller.cs public ActionResult Detail() { return View(); } |
http://localhost:7002/Shop/Product/Detail URL을 입력하면 다음과 같은 에러가 출력된다.
Detail.aspx는 ViewPage의 상속을 받지 않아서 생기는 문제이다.
Detail.aspx.cs의 코드를 수정하자.
Detail.aspx.cs using System.Web.Mvc; // 추가 namespace MvcMyApplication.Views.Product { public partial class Detail : ViewPage //System.Web.UI.Page 를 변경 { protected void Page_Load(object sender, EventArgs e) { } } } |
'Web Platform' 카테고리의 다른 글
ASP.NET MVC TagBuilder (0) | 2009.06.29 |
---|---|
ASP.NET MVC View (0) | 2009.06.29 |
ASP.NET MVC 개발 환경 만들기 (0) | 2009.06.29 |
ASP.NET MVC(Model, View, Controller)란? (0) | 2009.06.29 |
날짜 관련 함수 (0) | 2009.06.29 |