본문 바로가기

C#/근웹 연대기

c#으로 근본 없는 웹서버 개발기 20 : cshtml layout (이론)

⚠WARNING
ASP.NET에 대한 포스팅이 아닙니다
나가실 문은 오른쪽 하단입니다

 

1. 분석

asp.net MVC의 페이지 레이아웃 구조를 살펴보았는데, 

부모 페이지와 자식 페이지의 관계의 구분이 처음 배우는 사람의 입장으로서 조금 혼란스럽게 되어있다.

 

우선 베이스 페이지가 되는 _Layout.cshtml에 대해 살펴보자.

 

_Layout.cshtml

 

public abstract class RazorPage

 

이미지의 RenderBody라는 인터페이스를 virtual 키워드로 자식 페이지에서 상속받게 되어 있는데
이것을 만약에 연속적으로 상속 받을 경우 손자 페이지가 오버라이드 되어서
아빠 페이지의 내용이 무시 될 텐데, 어쩐지 무사히 아빠 페이지의 내용까지 잘 나온다.
즉 서브페이지 일 때, 같은 이름의 인터페이스를 상속 받는다면 불가능한 경우다.
이것에 대한 메커니즘을 알아보는 것은 귀찮다.
그래서 이것을 구현 한다면 페이지마다 이름이 다른 메서드를 상속받게 해야겠다.

만약 RenderBody를 호출 하면 실제로는  RenderBody_name 같이 말이다.
단순히 클래스 이름을 가져다 쓰면 될거 같지만, 다른 폴더에 동명이인이 존재할 수 도 있어서 클래스 이름 자체를 폴더 네임과 컴바인 해야 할 듯하다.

그리고 조금더 알아보니.. section이라는 키워드로 RenderBody를 완전히 대체할 수 있을 것으로 보인다.

 

 

2. 목업 코드

아래의 코드는 전체적인 계획을 반영 하였다.

//base.cshtml
<html>
<head>
    <title>@ViewData["Title"]</title>
    <link rel="stylesheet" href="./main.css"/>
</head>
<body>
    @RenderSection("content")
    @Include("footer")
    @RenderSection("scripts")
</body>
</html>

 

//home.cshtml
@layout("base"){
    ViewData["Title"] = "hello world";
}
@model List<string>
@section("content"){
    <ul class="Test">
    @foreach(var str in Model){
        <li>@str</li>
    }
    </ul>
}
@section("scripts"){
    <script src="./main.js"></script>
}

cshtml 에서

페이지를 상속받는 구문은 @{Layout =???. cshtml}이고
페이지를 삽입하는 구문은 Html.Partial("???")인데  뭔가 일괄성이 떨어지는 거 같아 위의 코드처럼 변경할 계획이다.

 

 

ETC

cshtml이 실제로 어떻게 컴파일 되는지 알고 싶다면 아래의 링크로 들어가 가장 하단 부분을 살펴보면 된다.

http://taeyo.net/columns/View.aspx?SEQ=558&PSEQ=40&IDX=0 

 

다음 계획은 이론은 여기서 끝내고 지금까지 정리한 내용을 토대로 코딩을 할 예정이다.

어떻게 코딩을 해야 할지 머리가 복잡하다...