Post List

2016년 5월 24일 화요일

ASP.NET MVC : View

View

View 란?

MVC Framework에서 사용자에게 결과를 보여주는 역할을 합니다.
ASP.NET에서는 Razor Engine을 이용하여 View를 조금 더 편하게 작성 할 수 있습니다. (.cshtmlRazor Engine이 무엇인지 간단하게 얘기하자면 View (HTML page) 작성시 C# 문법과 .NET Framework를 사용할 수 있습니다. LayoutPartial View를 이용하여 특정 영역만 따로 rendering 하는 것도 가능하며, 각종 Helper method를 제공하여서 반복적인 HTML TAG 작성 작업을 줄여주며, 직접 Helper method를 작성하여서도 활용 할 수 있습니다.
View의 기본적인 사용법은 Controller and Action 절에서 예제 작성시 간단히 언급했으므로 생략하도록 하겠습니다.
View를 편리하게 사용하기 위한 방법(주로 재활용 방안) 위주로 진행하겠습니다.

1. Layout section

Layout (주로 _Layout.cshtml 식의 명칭) 내부에는 section을 제공해 줍니다.
  • @RenderBody() : 해당 Layout을 사용하는 View의 내용이 이 위치에 삽입됩니다.
  • @RenderSection("Name") : View 에서 @section Name { ... } 의 내용이 해당 section에 삽입됩니다.
Layout에서 선언한 @RenderSection("...")이 View에서 사용하지 않으면 오류가 발생합니다. 해당 section에 선택적으로 사용을 하려면 (View에서 사용하지 않아도 오류가 발생하지 않게 하려면) @RenderSection("...", false)로 선언을 하면 됩니다.
*_Layout.cshtml
// _Layout.cshtml

...

<body>
    @RanderSection("Header")

    ...

    @RanderBody()

    ...

    @RanderSection("Footer", required = false)
</body>
  • Index.cshtml
@{
    Layout = "_Layout";
}

@section Header {
<div>This is Header</div>
}

<div>
    RenderBody contains every contents in this document, except @section ...
</div>

2. Partial View

Razor Tag, HTML Markup 으로 이루어진 동일한 코드를 반복적으로 사용할 경우 유용합니다.
  • Partial.cshtml
<div>
    This is Partial View.
    @Html.ActionLink("The Link of Index on this Controller", "Index")
</div>
  • List.cshtml
@{
    ViewBag.Title = "List";
    Layout = null;
}

<h3>List</h3>

@Html.Partial("Partial")
위의 경우 List.cshtml에서 Partial.cshtml의 Partial view를 사용하였는데, Partial view 내부를 보면 ActionLink를 Controller 이름을 명시하지 않았습니다. Partial View를 Rednering하는 곳이 List.cshtml 내부이기 때문에 해당 Controller를 기준으로 동작합니다.
Partial View도 ViewModel을 가질 수 있습니다. (Strongly Typed Partial View)
그럴 경우 @Html.Partial(...) 의 두번째 인자로 ViewModel을 전달해 줘야 합니다.
  • Partial2.cshtml
@model IEnumerable<string>
...
  • List.cshtml
...
@Html.Partial("Partial2", new [] { "Luna" , "Star" } )

3. Child Action

View 에서 호출되는 Action Method를 의미합니다. @Html.Action(...) helper method를 사용하면 모든 Action method를 View에서 호출이 가능하지만, [ChileActionOnly] 이란 attribute를 붙이면 Routing System에서 사용되지 않고 순수히 View에서 호출할 경우에만 동작하는 것을 의미합니다.
  • HomeController.cs
...
[ChildActionOnly]
public ActionResult Time()
{
    return PartialView(DateTime.Now);
}
  • Time.cshtml
@model DateTime
<div>
    @Model.ToShortTimeString()
</div>
  • List.cshtml
...
@Html.Action("Time")
Child Action에 매개변수가 필요한 경우에는 무명형식을 이용해서 전달이 가능합니다. 단 파라메터의 이름이 같아야 합니다.
  • HomeController.cs
...
[ChildActionOnly]
public ActionResult Time(DateTime time)
{
    return PartialView(DateTime.Now);
}
  • List.cshtml
...
@Html.Action("Time", new { time = DateTime.Now })