2017. 4. 20. 15:30

Asp.Net MVC에서 뷰와 컨트롤러의 데이터를 전달하는 방법 중 모델을 전달하는 방법 말고 3가지 방법이 더 있는데 뷰 백(View Bag), 뷰 데이터(View Data), 템프 데이터(Temp Data)가 있습니다.

 

각각을 어떻게 사용하는지 알아봅시다.

 

 

1. 각각의 용도

각각의 큰 특징은 다음과 같습니다.

 

1) 뷰백(ViewBag)

다이내믹(Dynamic) 오브젝트로 되어 있습니다.

직관적으로 사용할 수 있습니다.

자동으로 변수형을 유추하기 때문에 사용 시 형 변환이 필요 없습니다.

닷넷 프레임웍 3.5부터 사용할 수 있습니다.

 

2) 뷰데이터(ViewData)

딕셔너리(Dictionary) 콜랙션으로 되어 있습니다.

뷰백에 비해 속도가 빠릅니다.

값(Value)이 오브젝트로 나오기 때문에 형 변환을 해야 합니다.

 

3) 템프데이터(TempData)

뷰데이터와 같은 특성이 있습니다.

값이 세션에 임시 저장되어 리디렉션이 발생해도 값이 유지됩니다.

 

 

2. 사용 방법

각각의 방법으로 데이터를 전달해 봅시다.

 

'TestList'의 코드는 다음과 같습니다.

public List<string> TestList()
{
    List<string> Student = new List<string>();
    Student.Add("Jignesh");
    Student.Add("Tejas");
    Student.Add("Rakesh");
 
    return Student;
}

 

 

2-1. 컨트롤러에서 값 넣기

컨트롤러에서는 변수처럼 사용하면 됩니다.

ViewData["Student"] = this.TestList();
ViewBag.Student = this.TestList();
TempData["Student"] = this.TestList();

 

 

2-2. 뷰에서 사용하기

뷰에서는 뷰백을 제외한 나머지는 형 변환을 해야 합니다.

@foreach (var student in ViewBag.Student)
{
    <li>@student</li>
}
 
@foreach (var student in ViewData["Student"] as List<string>)
{
    <li>@student</li>
}
 
@foreach (var student in TempData["Student"] as List<string>)
{
    <li>@student</li>
}

 

 

3. 리디랙션 테스트

리디랙션(redirection)전에 값을 저장하고 리디랙션된 페이지에서 값을 확인해 봅시다.

public ActionResult RedirectTest()
{
    ViewData["Student"] = this.TestList();
    ViewBag.Student = this.TestList();
    TempData["Student"] = this.TestList();
    return new RedirectResult(@"~\Default\RedirectTaget");
}
 
public ActionResult RedirectTaget()
{
    return View();
}

 

'RedirectTest()'는 자신의 뷰없이 'RedirectTaget()'로 리디렉션만 합니다.

'RedirectTaget()'은 따로 값을 저장하지 않고 뷰만 띄워줍니다.

데이터가 없으면 오류가 나므로 예외 처리 해줍니다.

<h2>View Bag</h2>
<ul>
    @if (null != ViewBag.Student)
    {
        foreach (var student in ViewBag.Student)
        {
            <li>@student</li>
        }
    }
    else
    {
        <li>no data</li>
    }
</ul>
<br />
<br />
<h2>View Data</h2>
<ul>
    @if (null != ViewData["Student"])
    {
        foreach (var student in ViewData["Student"] as List<string>)
        {
            <li>@student</li>
        }
    }
    else
    {
        <li>no data</li>
    }
</ul>
<br />
<br />
<h2>Temp Data</h2>
<ul>
    @if (null != TempData["Student"])
    {
        foreach (var student in TempData["Student"] as List<string>)
        {
            <li>@student</li>
        }
    }
    else
    {
        <li>no data</li>
    }
</ul>

 

이제 테스트해봅시다.

 

템프데이터만 값이 유지되는 것을 확인할 수 있습니다.

 

 

마무리

예제 프로젝트 : 

ASPNetMvc_VDVBTD.zip
다운로드

 

참고 : c# Corner - ViewData VS ViewBag Vs TempData in MVC

 

그런데 뷰백이나 뷰데이터 같은 모델 외의 데이터 전달을 난발하는 것이 좋은 것인가.....

하는 문제는 남아 있습니다.

 

ASP.NET MVC에서는 원칙적으로는 하나의 뷰는 하나의 모델이지만 이런 방법을 이용하여 여러 개의 모델을 주고받을 수 있습니다.