What Are ViewData, ViewBag, & TempData in ASP.NET MVC?
일부 개발자는 ASP.NET MVC ViewData, ViewBag 및 TempData의 차이점과 사용법에 어려움을 겪을 수 있습니다. 이 블로그 게시물에서 모든 것을 설명합니다.
나는 종종 초급 개발자가 ASP.NET MVC에서 ViewData, ViewBag 및 TempData의 차이점과 사용법에 어려움을 겪는 것을 보았습니다. 이 주제에 대한 많은 기사와 블로그 게시물이 있지만 간단하게 설명하려고 노력하겠습니다.
우선 ViewData, ViewBag 및 TempData는 모두 서로 다른 시나리오에서 데이터를 전달하거나 전달하는 데 사용되는 ASP.NET MVC의 개체입니다. 다음과 같은 경우 데이터를 전달해야 하는 요구 사항이 있을 수 있습니다.
- 컨트롤러에서 보기로 데이터를 전달합니다.
- 한 컨트롤러에서 다른 컨트롤러로 데이터를 전달합니다.
- 한 작업에서 다른 작업으로 데이터를 전달합니다.
- 후속 HTTP 요청 간에 데이터 전달
상위 수준에서 아래 이미지와 같이 ViewData, ViewBag 및 TempData의 사용을 설명할 수 있습니다.

컨트롤러에서 뷰로 데이터 전달하기
컨트롤러에서 보기로 데이터를 전달하는 시나리오를 생각해 보겠습니다. 일반적으로 모델을 사용하여 복잡한 데이터를 뷰에 전달합니다. 여기서는 아래 목록과 같이 데이터 모델 List를 사용하는 강력한 형식의 View가 있다고 가정해 보겠습니다.
public ActionResult Index() { List<Product> p = new List<Product>() { new Product { Id = 1, Name = "Pen", Price = 300 }, new Product { Id = 2, Name = "Pencil", Price = 100 } }; return View(p); }
뷰에서 데이터는 아래 목록에 표시된 대로 모델을 렌더링하여 표시됩니다.
<table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Name) th> <th> @Html.DisplayNameFor(model => model.Price) th> <th>th> tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) td> <td> @Html.DisplayFor(modelItem => item.Price) td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | @Html.ActionLink("Details", "Details", new { id=item.Id }) | @Html.ActionLink("Delete", "Delete", new { id=item.Id }) td> tr> } </table>
이제 컨트롤러에서 뷰로 데이터(모델 제외)를 전달해야 하는 요구 사항이 있습니다. 데이터를 전달할 수 있는 두 가지 방법이 있습니다.

Product 데이터 모델 외에 뷰에 간단한 문자열을 전달한다고 가정해 보겠습니다.
Passing data using ViewBag
아래 목록과 같이 ViewBag을 사용하여 데이터를 전달할 수 있습니다.
public ActionResult Index() { ViewBag.data1 = "I am ViewBag data"; return View(p); }
뷰에서 ViewBag 데이터는 아래 목록과 같이 ViewBag의 속성으로 읽을 수 있습니다.
<h2>@ViewBag.data1</h2>
Passing data using ViewData
아래 목록과 같이 ViewData를 사용하여 데이터를 전달할 수 있습니다.
public ActionResult Index() { ViewData["data1"] = "I am ViewBag data"; return View(p); }
뷰에서 ViewData 데이터는 아래 목록과 같이 ViewData의 문자열 값 쌍으로 읽을 수 있습니다.
<h2>@ViewData["data1"]h2>
ViewData와 ViewBag의 차이점을 살펴보겠습니다. ViewBag 는 동적 유형을 기반으로하는 동적 속성이고 ViewData 는 사전 객체입니다. ViewBag에서 속성으로, ViewData에서 키-값 쌍으로 데이터를 읽을 수 있습니다. 둘 다에 대한 몇 가지 글머리 기호는 다음과 같습니다.
ViewData
- ViewDataDictionary 클래스 유형의 속성입니다.
- 데이터는 키-값 쌍의 형태로 전달될 수 있습니다.
- 뷰에서 복합 형식 데이터를 읽으려면 타입캐스팅이 필요합니다.
- 예외를 방지하려면 null 검사가 필요합니다.
- ViewData의 수명은 현재 요청으로 제한되며 리디렉션 시 Null이 됩니다.
- ViewData는 ControllerBase 클래스의 속성입니다
ViewBag
- dynamic 유형의 속성입니다.
- 데이터는 개체의 속성으로 전달됩니다.
- 데이터를 읽기 위해 타입캐스팅할 필요가 없습니다.
- null 검사는 필요하지 않습니다.
- ViewBag의 수명은 현재 요청으로 제한되며 리디렉션 시 Null이 됩니다.
- ViewBag은 ControllerBase 클래스의 속성입니다.
ControllerBase 클래스에서는 둘 다 아래 이미지와 같이 속성으로 정의됩니다.

ViewBag 및 ViewData는 단일 주기에서 컨트롤러에서 view로 데이터를 전달하는 데 사용되는 개체로 요약할 수 있습니다. ViewBag 및 ViewData에 할당된 값은 다음 HTPP 요청에서 또는 다른 보기로 이동할 때 무효화됩니다.
TempData
ViewData와 ViewBag의 주요 속성 중 하나는 수명 주기가 하나의 HTTP 요청으로 제한된다는 것입니다. 리디렉션 시 데이터가 손실됩니다. 한 HTTP 요청에서 다음 HTTP 요청으로 데이터를 전달하는 또 다른 시나리오가 있을 수 있습니다. 예를 들어, 한 컨트롤러에서 다른 컨트롤러로 데이터를 전달하거나 한 작업을 다른 작업으로 전달합니다. TempData는 한 요청에서 다음 요청으로 데이터를 전달하는 데 사용됩니다.

Index action에서 Read action으로 이동하고 탐색하는 동안 Index action에서 Read action으로 데이터를 전달하고 싶다고 가정해 보겠습니다. 따라서 Index 작업에서 아래 목록과 같이 TempData에 값을 할당할 수 있습니다.
public ActionResult Index() { TempData["data1"] = "I am from different action"; return RedirectToAction("Read"); }
TempData를 키-값 쌍으로 읽을 수 있습니다. 읽기 작업에서 TempData는 아래 목록과 같이 읽을 수 있습니다.
public string Read() { string str; str = TempData["data1"].ToString(); return str; }
ViewData와 마찬가지로 TempData도 사전 개체이며 데이터를 읽으려면 타입 캐스팅 및 null 검사가 필요합니다. TempData는 후속 HTTP 요청에만 데이터를 유지할 수 있습니다. 리디렉션에 대해 확신이 있는 경우 TempData를 사용하여 데이터를 전달합니다.
TempData에 대한 몇 가지 사항은 다음과 같습니다.
- TempData는 한 HTTP 요청에서 다음 HTTP 요청으로 데이터를 전달하는 데 사용됩니다.
- 즉, TempData는 한 컨트롤러에서 다른 컨트롤러로 데이터를 전달하거나 작업을 다른 작업으로 전달하는 데 사용됩니다.
- TempData는 BaseController 클래스의 속성입니다.
- TempData는 세션 개체에 데이터를 저장합니다.
- TempData는 ControllerBase 클래스의 속성입니다.
- 데이터를 읽으려면 Typecasting 및 null 검사가 필요합니다.
- TempData의 형식은 TempDataDictionary입니다.
- TempData는 HTTP 302/303 상태 코드와 같은 HTTP 리디렉션과 함께 작동합니다.
요약
ViewData, ViewBag 및 TempData는 컨트롤러, 작업 및 뷰 간에 데이터를 전달하는 데 사용됩니다. 컨트롤러에서 뷰로 데이터를 전달하려면 ViewData 또는 ViewBag을 사용할 수 있습니다. 한 컨트롤러에서 다른 컨트롤러로 데이터를 전달하려면 TempData를 사용할 수 있습니다.
이제 ViewBag, ViewData 및 TempData의 개념이 좀 더 명확 해졌기를 바랍니다.
웹 앱용 jQuery HTML5 컨트롤을 사용해 보고 놀라운 기능을 즉시 활용하세요. 지금 무료 평가판을 다운로드하세요!
