ASP.NET MVC3 쓰시던 분에게는 이미 아시는 팁일겁니다.

이때 한가지 다행인 점은 상속도 MVC에 쓰던 방식과 똑같다는 것입니다.

다른 점이 있다면 MVC는 WebViewBase 고 일반 페이지는 WebPageBase 클래스라는 점이죠.


바로잡습니다.

InitializePage 페이지는 요청된 페이지를 초기화하기 위한 추상 메서드이며,

Execute 메서드가 실제 렌더링에 수행할 추상 메서드입니다.

Execute 는 에디터상에 나타나지 않도록 특성이 적용되어 나타나지 않을 겁니다.

메서드 설명을 잘못해서 혼란을 불러 일으킨 점 죄송합니다.


오랜만에 팁을 올린다. 으하하하핳ㅎ하핳ㅎㅎ.

오늘은 조금 럭셔리한 팁을 올리고자 한다.

먼저, 예전 컨트롤 부왘 쓰던 시절에는 aspx 파일과 aspx.cs 파일. 얼마나 그립지 아니한가.

이녀석의 비하인드 영역을 보면 이렇게 되어 있다.

  1.           public partial class MyPage : System.Web.UI.Page
                  {
                      protected void Page_Load(object sender, EventArgs e)
                      {
                          //부왘...
                      }
                  }
              

아.. 그립다.ㅋ

그리고 Page 이 클래스를 커스터마이징을 해서...

  1.           public class MyPageBase : System.Web.UI.Page
                  {
                      //여기에 넣고싶은 멤버들 솰라솰라...
                      public int One { get { return 1; } }
                  }
              

이걸 상속받아 페이지를 만드는 식으로도 운영해본 경험도 있을 것이다.

  1.           public partial class MyPage : MyPageBase
                  {
                      protected void Page_Load(object sender, EventArgs e)
                      {
                          Response.Write(One);
                      }
                  }
              

그러다가 .NET도 4로 진화하고 여러가지 새로운 일이 생기고, 이제 일반 ASP.NET 외에 다른 방식으로 웹 사이트를 꾸미는 방법이 생겼다.

바로 Razor로 웹 사이트를 만드는게 가능해졌다는 것이다.

원래 WebMatrix 라고 해서 초짜들에게 우리 기술로 웹사이트 쉽게 만들어준데이 라면서 내놓은 제품이다.

하지만 현실은 ASP.NET 만져본 분들이 대부분 도전정신삼아 시도하는 것이 대부분일 것이다.

토닥.

하지만 ASP.NET 과는 달리 이벤트 및 서버 컨트롤 기반에서 빠져나가 왠지 PHP를 보는 듯한 이 기분을 어루만질 수도 있을 것이다.

사실 Razor는 절차 지향적 템플릿 기법이다. 하지만 빠르다. 페이지 하나 만드는 방법이 정말 간결해지고 좋아졌다.

.NET 문법과 클래스를 그대로 사용할 수 있으며, 온갖 서버 컨트롤도 없어서 이게 신선한 충격이 아니던가?

근데 하나의 의문점이 있다. 단, ASP.NET MVC 해본사람은 감잡을지도.

얘는 대체 어떤 클래스를 상속받지?

이벤트도, 상속받는 클래스 이름도 안보인다. 네임스페이스 검색해보면 ASP가 보인다.

this 치고 Ctrl+Space 치면 분명 클래스 멤버들은 나오는데.. 감잡을 만한 클래스라고는 WebPageBase 뿐이다.

올ㅋ 대단한 발견 하신거다. Razor 페이지는 먼저 WebPageBase를 상속받는다. System.Web.WebPages.WebPageBase

그럼 System.Web.Razor는 뭐하는놈임? 그놈은 런타임에 Razor 템플릿을 해석하여 닷넷이 컴파일 하기 쉽도록 코드를 재생성 시켜주는 기능이 있다.

하지만 우리는 그럴 일 없으므로 신경 끄자.

이제 감잡았으면 상속도 이제 시간문제다. 먼저 WebPageBase를 보자.

  1.           public abstract class WebPageBase : WebPageRenderingBase
              

근데.. 상속받는 놈은 대체 뭐냐..

신경 끄자. 렌더링을 정의한 메서드들을 추상화한 놈이다.

우린 이 멤버들을 일체 건드릴 일은 없다. 우리가 할 일은, 바로 원하는 클래스를 재생성하여 페이지에 상속하는 것이다.

하지만! 가장 중요한 두가지 메서드가 있다. 바로 ExecutePageHierarchy 와 InitializePage 그리고 Execute 메서드 이다.

먼저 InitializePage 메서드는 지금 작업중인 cshtml 파일을 초기화 하기 위한 추상 메서드다. 추상 메서드니 작업은 따로 진행된다.

실제 렌더링 메서드는 Execute 라는 추상 메서드이며, ASP.NET 이벤트로 비유하자면 다음과 같다

Razor = ASP.NET

InitializePage = Page_Init

Execute = Page_Load

그리고 ExecutePageHierarchy 가 있는데 작업중인 cshtml 파일 안에 정의된 레이아웃 페이지나 별도의 렌더링할 자식 페이지를 실행하는데 사용하는 메서드다.

이 두 메서드가 관여하는데 중요한 이유는 바로 우리는 cshtml 파일을 작업할 때 내용을 바로 추상화된 Execute 메서드의 내용을 작성하는데 사용한다는 것이다.

그래서 재밌는 한가지 사실. return; 문이 허용된다는 것. return; 한번 써주면 당연히 그 아래에 있는 코드들은 작동이 안될 것이다.

자, 이제 상속받을 나만의 Razor 페이지를 만들어보자.

간단하다. WebPageBase 를 참조하면 된다.

  1.           public abstract class HazardPage : System.Web.WebPages.WebPage
                  {
                      //여기에 넣고싶은 멤버들 솰라솰라...
                      public int One { get { return 1; } }
                  }
              

끝. 이제 cshtml에 상속 받으면 된다.

ASP.NET MVC 3을 만져보신 분들은 눈치 백배일 것이다. razor 구문에 @inherits 뒤에 상속받고자 하는 클래스를 넣어주면 땡.

물론 첫줄에다가 넣어주시면 된다.

  1.           @inherits Hazard.Razor.WebPage.HazardPage
              

그 아래에 평소대로 작성하시면 된다.

 

강좌는 이걸로 끝.

일단 ASP.NET 에서 Page를 직접 상속받은 후 페이지마다 상속받는 이유를 아시겠지만, 비즈니스 영역에 필요한 부분이 있어서일 것이다.

물론 MVC 같은 경우는 비즈니스 모델에 맞는 뷰를 만들기 위해 상속을 받아서 작성하는 것.

진짜끝.





profile
20대 언제나 쿨한 개발(犬足)자.