ASP.NET MVC Routing

 

블로그나 카페등에서 사용되는 확장자 없는 URL을 자유롭게 설정해 주는 기능

Global.asax에서 routes.MapRoute() 메소드를 통해 매핑규칙을 추가하면

http://www.mnstime.com/microsoft/aspnet/mvc/routing 와 같은 URL이 가능하다는 것이다.

 

RoutingGlobal.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

            );

http://localhost/Plan/View/2

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를 넣어주는게 좋은 방법이다.

 

 

URLController 찾기

http://localhost/Shop

기본으로 Product Controller Index Method를 호출하여 /Product Index.aspx를 호출한다.

 

http://localhost/Shop/Product2/

Product2 Controller Index Method를 호출하여 /Product Index.aspx를 호출한다.

 

http://localhost/Shop/Product3/

Product3 Controller가 존재하지 않아 오류가 발생한다.

 

 

URLParameter 전달하기

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/ProductView 항목을 통해 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

+ Recent posts