Programming/.NET

1. 레이아웃 섹션

 

섹션을 사용하면 뷰(View)내부의 특정 컨텐츠영역을 공유되는 레이아웃에 렌더할 수 있습니다.

 

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@section Top {
    <div>Top 영역</div>
}

<div>뷰 본문</div>

@section Bottom{
    <div>Bottom 영역</div>
}

 

레이아웃을 사용하는 뷰페이지(Index)의 예입니다. 섹션은 레이아웃 페이지에 표시할 내용으로서 HTML이나 Razor구문을 포함할 수 있습니다.

 

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>
    @RenderSection("Top")
    <div>
        @RenderBody()
    </div>
    @RenderSection("Bottom")
</body>
</html>

 

레이아웃 페이지에서는 RenderSection 메서드를 통해 출력할 영역을 지정합니다. 그러면 해당하는 섹션에서 뷰에 정의된 내용이 표현되고 나머지는 RenderBody 메서드로 출력됩니다.

 

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>
    @if (IsSectionDefined("Top"))
    {
        @RenderSection("Top")
    }
    else
    {
        <div>없음</div>
    }
    <div>
        @RenderBody()
    </div>
    @RenderSection("Bottom")
</body>
</html>

 

레이아웃에서 특정 세션의 정의여부는 IsSectionDefined 메서드로 확인할 수 있습니다.

 

@RenderSection("Top"false)

 

RenderSection 두번째 매개변수를 false로 전달하면 만약 해당하는 섹션이 뷰에서 정의되어 있지 않더라도 예외를 발생시키지 않도록 합니다.

 

2. 부분뷰

 

부분뷰는 여러 페이지에서 중복적으로 보여져야할 특정 컨텐츠의 내용을 담아놓은 뷰로서 다른 뷰에서 부분뷰를 포함시킴으로서 여러 뷰에서 동일한 컨텐츠를 표현하는 것이 가능합니다.

 

우선 뷰를 부분뷰로 생성하기 위해서는 뷰를 생성할때 Add View 화면에서 Create as a partial view 를 선택합니다.

 

 

부분뷰 파일이 생성되면 파일내용을 아래와 같이 작성합니다. 파일 내용은 html과 razor구문이 포함될 수 있습니다.

 

<div>
    이름 : @Html.TextBox("user_name") <br />
    아이디 : @Html.TextBox("user_id")
</div>

 

 

부분뷰를 위와 같이 만들어 두면 다른 뷰파일에서는 부분뷰의 내용이 필요한 부분에 @Html.Partial 메서드로 부분뷰를 포함시킬 수 있습니다.

 

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@section Top {
    <div>Top 영역</div>
}

<div>뷰 본문</div>
@Html.Partial("MyPartialView")

@section Bottom{
    <div>Bottom 영역</div>
}

 

부분뷰는 일반적인 뷰와 마찬가지로 강력한 형식의 뷰로 만들면 특정 모델개체를 뷰로 전달할 수 있습니다.

 

@model object

<div>
    이름 : @(((string[])Model)[0]) <br />

    아이디 : @(((string[])Model)[1])
</div>

 

예제의 부분뷰는 IEnumerable 형식을 모델을 받는 강력한 형식의 뷰로서 전달받은 모델을 통해 배열을 열거하고 있습니다.

 

@Html.Partial("MyPartialView"new[] { "홍길동""hong" })

 

강력한 형식의 부분뷰를 포함할때는 두번째 매개변수에 전달하고자 하는 모델개체를 지정하면 됩니다.

 

3. 자식 액션

 

프로그램의 비지니스 로직에서 동적으로 생성된 데이터를 다수의 뷰에서 포함해야 하는 경우에는 해당 로직을 포함한 프로그램부분을 자식 액션으로 만들고 뷰에서 이를 포함하는 형태로 처리할 수 있습니다. 예를 들어 현재 시간과 날짜를 포함하는 특정 내용을 여러 뷰에서 포함해 출력해야 하는 경우

 

public ActionResult NowTime()
{
    return PartialView((object)DateTime.Now.ToString("yyyy년 MM월 dd일 HH시 mm분입니다."));
}

 

우선 필요한 액션메서드를 만들고 해당 메서드에서 뷰를 호출하도록 합니다. 이때 PartialView로 부분뷰를 호출하도록 하고 있으므로

 

@model string

<span> 안녕하세요 현재시간 @Model 입니다.</span>

 

뷰를 부분뷰로 만들어야 합니다. 예제에서는 강력한 형식의 부분뷰를 생성하였습니다.

 

@Html.Action("NowTime")

 

일반뷰에서는 위와 같이 Action 메서드로 자식액션을 호출할 수 있습니다. 그러면 자식액션은 부분뷰를 불러와 Action 메서드가 호출된 부분에 포함시킬것입니다.

 

@Html.Action("NowTime""MyController")

 

Action 메서드는 기본적으로 현재의 컨트롤러에서 액션메서드를 찾게 되는데 예제에서처럼 두번째 매개변수로 컨트롤러명을 지정하면 해당 컨트롤러에서 액션메서드를 찾게 됩니다.

 

그런데 NowTime 액션메서드는 /Home/NowTime 과 같은 URL요청에도 응답할 수 있습니다. 만약 이 액션메서드를 반드시 자식액션메서드의 요청에만 응답하도록 하려면

 

[ChildActionOnly]
public ActionResult NowTime()
{
    return PartialView((object)DateTime.Now.ToString("yyyy년 MM월 dd일 HH시 mm분입니다."));
}

 

위에서 처럼 ChildActionOnly 속성을 추가해 줘야 합니다.

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

[C#] async / await  (0) 2018.09.04
[C#] Path  (0) 2018.08.23
[ASP.NET MVC] 뷰 (View)  (0) 2018.08.14
[C#] using static  (0) 2018.07.27
[ASP.NET MVC] 헬퍼메서드(Helper Method)  (0) 2018.07.18
[C#] extern  (0) 2018.07.03
0 0