Programming/.NET

ASP.NET MVC에서는 기본구조인 컨트롤러와 뷰, 그리고 라우팅시스템까지 전 구조를 통째로 분리하여 '영역'이라는 것을 만들고 이를 웹프로그램에 그대로 적용할 수 있습니다.

 

프로젝트에 '영역(Area)'을 추가하려면 프로젝트에서 마우스 오른쪽 버튼을 눌러 'Add -> Area'를 클릭합니다. 그런다음 적당한 영역이름을 입력하고 'OK'버튼을 클릭하면 다음과 같은 영역이 프로젝트에 생성됩니다.

 

 

예제는 이름을 'MyArea'로 하였습니다.

 

영역을 추가하고 나면 MyAreaAreaRegistration.cs 파일을 자동으로 열어 보여주는데 이 파일에서 RegisterArea 메서드에 보면 MyArea 영역에 대한 라우트정보가 새로 구성되어 있음을 확인할 수 있습니다.

 

public class MyAreaAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "MyArea";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "MyArea_default",
            "MyArea/{controller}/{action}/{id}",
            new { action = "Index"id = UrlParameter.Optional }
        );
    }
}

 

클래스는 AreaRegistration 클래스를 상속받아 내부에 RegisterArea 메서드를 통해 라우트정보를 등록하고 있는데 이 메서드는 프로젝트의 Global.asax 파일에서

 

AreaRegistration.RegisterAllAreas();

 

AreaRegistration 개체의 RegisterAllAreas 정적메서드를 호출하여 AreaRegistration 를 상속받은 모든 클래스를 찾도록 합니다. 그런 후 해당 클래스가 존재하면 내부에 RegisterArea 메서드를 호출함으로서 라우트가 적용될 수 있도록 합니다.

 

라우트정보에 따라 새롭게 생성된 영역은 이제부터 컨트롤러와 뷰를 적절히 배치하여 MyArea/Home/Index 와 같은 형식으로 접근이 가능하게 됩니다. 그러나 주의해야할 것이 있는데 만약 메인 프로젝트에서 Home컨트롤러가 존재하고 영역에도 Home컨트롤러가 존재한다면 /Home/Index 형식으로 접근할때 오류를 발생시킬 수 있습니다. 따라서 다음과 같이 우선적으로 처리될 기본 네임스페이스를 지정해야 합니다.

 

routes.MapRoute("Default""{controller}/{action}/{id}"new { controller = "Home"action = "Index"id = UrlParameter.Optional }new[] { "WebApplication1.Controllers" });

 

참고로 네임스페이스의 우선순위는 Global.asax 의 Application_Start 메서드 에서도 다음과 같이 설정할 수 있습니다.

 

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);

    ControllerBuilder.Current.DefaultNamespaces.Add("MyNamespace");
    ControllerBuilder.Current.DefaultNamespaces.Add("MyName*");
}

 

MyName에 *은 해당 네임스페이스와 자식 네임스페이스도 포함된다는 것을 의미합니다.

 

'영역'이라는 것은 새롭게 프로젝트에 추가해서 만들 수 있을 뿐만 아니라 필요하다면 기존에 있던 컨트롤러에 영역속성을 추가하여 새로운 영역을 생성하는 것도 가능합니다.

 

[RouteArea("abc")]
public class HomeController : Controller
{
    // GET: Home
    [Route("Home")]
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult MyPage()
    {
        return View();
    }
}

 

기존에 HomeController에 RouteArea 속성을 추가하여 abc라는 영역을 생성하였습니다. 또한 Index 액션메서드에는 Route 속성도 추가되었으므로 /abc/Home/Index 과 같은 방법으로 접근할 수 있게 됩니다.

 

참고로 만약 영역안에서 다른 영역에 존재하는 액션메서드를 찾아가는 링크를 생성해야 한다면 area 속성을 만들어서 해당하는 영역을 지정해 줘야 합니다.

 

@Html.ActionLink("go""Index"new { area = "MyArea2" })

만약 별도의 영역이 아닌 최상위의 경우라면 area는 ""형식으로 공백을 지정하도록 합니다.

'Programming > .NET' 카테고리의 다른 글

Invalid pointer (Exception from HRESULT: 0x80004003 (E_POINTER))  (0) 2018.10.24
[C#] 네트워크 - TCP  (0) 2018.10.17
[ASP.NET MVC] 영역(Area)  (0) 2018.10.10
[C#] 네트워크 - UDP  (0) 2018.09.20
[C#] async / await  (0) 2018.09.04
[C#] Path  (0) 2018.08.23
0 0