일단 dotnet 튜토리얼에서 지금까지 나온 것들을 정리해보면....

1. 문자열 리턴

public string Index() {
    return "HelloWorld Index String return";
}

return 타입 string

 

2. 변수를 문자열 처리해서 리턴

public string Welcome(string name, int ID = 1) {
    return HttpUtility.HtmlEncode("Hello " + name + ", ID is: " + ID);
}

return 타입 string
변수는 Http.Utility를 이용해 Html로 인코딩 해서 리턴

 

3. Razor로 페이지 리턴

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

문제는 이게 jsp처럼 서버에서 페이지를 html로 컴파일 해서 넘겨주는건지, html을 바로 넘겨주는건지 잘 모르겠다. 아마 html쪽 같아 보이기는 한데... 확장자는 또 왜 cshtml인건지;;

아무튼 return 타입은 ActionResult고 View()를 리턴한다고만 되어있다.

이 때도 역시 파일명을 따로 설정하지 않고 자동으로 매칭된다.

매칭되는 파일은 VIews/컨트롤러 이름/메소드이름.cshtml이 된다.

따라서 HelloWorldController의 Index 메소드의 View()에 의해 리턴되는 파일은 Views/HelloWorld/Index.cshtml이 된다.

Index.cshtml 파일은 다음과 같이 작성된다.

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@{ 
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>Hello from our View Template!</p>

wktpgl qhaus자세히 보면 layout이 Views에 있는 다른 공유된 cshtml파일을 가리킨다. 거기에 이 페이지에서 추가한 코드 일부가 기본 탬플릿(?)같은 역할을 하는 레이아웃에 추가되서 완성된 페이지가 된다. (ViewBag.Title이라는거는 아래 레이아웃 페이지에 보면 <title></title>태그 사이에 @ViewBag.Title이라고 적혀있는 것을 볼 수 있을 것이다. 즉, 해당 변수를 "Index"라 하였으므로 탭에 표시되는 타이틀은 다음과 같다. 'Index - My ASP.NET Application')

참고로, _Layout.cshtml파일의 내용은 다음과 같다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                </ul>
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

 

따라서 이런 페이지를 응답으로 받게 된다.

이 레이아웃에서 가장 중요한 부분은 '@RenderBody()'이란 annotation(?)이 있는 곳이다.

이곳에 각 Views에서 작성한 cshtml파일의 코딩 내용이 저 부분이 injection 되어 페이지가 완성된다.
(@ViewBag.Title처럼 정해진 위치로 가는 코드 제외)

위 코드를 조금 더 자세히 뜯어보면

<div class="navbar-collapse collapse">
  <ul class="nav navbar-nav">
    <li>@Html.ActionLink("Home", "Index", "Home")</li>
    <li>@Html.ActionLink("About", "About", "Home")</li>
    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
  </ul>
</div>

이런 코드가 보일것이다. 모든 페이지에 네비게이터를 추가해주는 코드이다. 

해당 메소드는 다음과 같은 역할을 한다.

음... 이렇게 보니 jsp 비슷한 건가보다... 서버에서 렌더링 해서 내려보내주는.... 아니 왜 최신 튜토리얼에서 이런 방식을...?? 프론트엔드/백엔드 완전히 나누는게 아니고 개발자가 디자인 빼고 다 하는... 완전 한국식인 것 같은데;;;

 

 

+ Recent posts