Asp.Net MVC에서 뷰와 컨트롤러의 데이터를 전달하는 방법 중 모델을 전달하는 방법 말고 3가지 방법이 더 있는데 뷰 백(View Bag), 뷰 데이터(View Data), 템프 데이터(Temp Data)라는 것이 있습니다.
각각을 어떻게 사용하는지 알아봅시다.
각각의 큰 특징은 다음과 같습니다.
1) 뷰백(ViewBag)
다이나믹(Dynamic) 오브젝트로 되어 있습니다.
직관적으로 사용할 수 있습니다.
자동으로 변수형을 유추하기 때문에 사용 시 형 변환이 필요 없습니다.
닷넷 프레임웍 3.5부터 사용할 수 있습니다.
2) 뷰데이터(ViewData)
딕셔너리(Dictionary) 콜랙션으로 되어 있습니다.
뷰백에 비해 속도가 빠릅니다.
값(Value)이 오브젝트로 나오기 때문에 형 변환을 해야 합니다.
3) 템프데이터(TempData)
뷰데이터와 같은 특성을 가지고 있습니다.
값이 세션에 임시저장되어 리디렉션이 발생해도 값이 유지 됩니다.
각각의 방법으로 데이터를 전달해 봅시다.
'TestList'의 코드는 다음과 같습니다.
1
2
3
4
5
6
7
8
9 |
public List<string> TestList()
{
List<string> Student = new List<string>();
Student.Add("Jignesh");
Student.Add("Tejas");
Student.Add("Rakesh");
return Student;
} |
cs |
컨트롤러에서는 변수처럼 사용하면 됩니다.
1
2
3 |
ViewData["Student"] = this.TestList();
ViewBag.Student = this.TestList();
TempData["Student"] = this.TestList(); |
cs |
뷰에서는 뷰백을 제외한 나머지는 형 변환을 해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
@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>
} |
cs |
리디랙션(redirection)전에 값을 저장하고 리디랙션된 페이지에서 값을 확인해 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12 |
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();
} |
cs |
'RedirectTest()'는 자신의 뷰없이 'RedirectTaget()'로 리디렉션만 합니다.
'RedirectTaget()'은 따로 값을 저장하지 않고 뷰만 띄워줍니다.
데이터가 없으면 오류가 나므로 예외처리를 해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 |
<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> |
cs |
이제 테스트해봅시다.
템프데이터만 값이 유지 되는 것을 확인할 수 있습니다.
예제 프로젝트 : ASPNetMvc_VDVBTD.zip
참고 : c# Corner - ViewData VS ViewBag Vs TempData in MVC
그런데 뷰백이나 뷰데이터 같은 모델 외의 데이터 전달을 난발하는 것이 좋은 것인가.....
하는 문제는 남아 있습니다.
asp.net mvc에서는 원칙적으로는 하나의 뷰는 하나의 모델이지만 이런 방법을 이용하여 여러 개의 모델을 주고받을 수 있습니다.
[ASP.NET Core 2] 빈 프로젝트 세팅 (1) - 'index.html'을 시작페이지로 설정하기 (0) | 2017.06.27 |
---|---|
[ASP.NET Core] ASP.NET Core를 IIS8(IIS7 이상)에서 사용하기 (0) | 2017.06.06 |
[ASP.NET MVC] 뷰 백(View Bag)과 뷰 데이터(View Data) 그리고 템프 데이터(Temp Data) (0) | 2017.04.20 |
[Asp.net] Web API를 세션으로 관리하기 (0) | 2016.10.31 |
[Asp.net] Web API + jquery 사용하기 (0) | 2016.10.27 |