본문 바로가기

ASP.NET&C#/ASP.NET MVC

[ASP.NET CORE/MVC] #6 VIEW로 데이터 가져오기

[ASP.NET CORE/MVC] #6 VIEW로 데이터 가져오기

안녕하세요 미나라이입니다.

 

이번에는 ASP.NET CORE MVC Web의 VIEW페이지에 데이터를 가져오는 방법들에 대해서 간단하게 포스팅 해보려고 합니다.

 

프로젝트 환경

OS : Windows 10

IDE : Visual Studio Code 1.62.2

.Net SDK : 5.0.403

.Net Runtime : .NetCore.App 5.0.10 / 5.0.12

 

ASP.NET CORE에서 VIEW페이지로 리턴 할 때 데이터를 가져오는 방법은 크게 세가지가 있습니다.

 

VIEWDATA

특징

- 데이터 타입은 Dictionary<string, object>(자바로 치면 Map)타입이고 값을 키값으로 접근 할 수 있습니다.

- VIEWBAG보다는 퍼포먼스 면에서는 우위에 있다고 합니다.

- MVC 1.0버전에서 도입되었고 상위 버전은 모두 사용 할 수 있습니다.

- .NET Framework 3.5이상에서 사용 할 수 있습니다.

- 값이 오브젝트형이기 때문에 형변환 처리를 해 주어야 합니다.

- 페이지간 이동이 발생 될 때 값은 사라집니다. (컨트롤러에서부터 다시 취득 해야 함)

 

사용 예제

HomeController.cs

public IActionResult Index()
{
  // 문자형 타입
  ViewData["ViewData"] = "ViewData입니다.";
  // 배열형 타입
  ViewData["ViewArr"] = new int[]{1,2,3} ;

  return View();
}

Index.cshtml

<!-- 문자열을 그대로 출력 할 경우엔 형변환 하지 않아도 됩니다. -->
<div>@ViewData["ViewData"]</div>
<!-- 변수에 담아서 사용 할 경우엔 형변환을 해야합니다. -->
@{  
    string data = @ViewData["ViewData"].ToString();
    int[] viewdata = @ViewData["ViewArr"] as int[];
}
@for (int i = 0; i < viewdata.Length; i++)
{
    <div>@viewdata[i]</div>
}

출력 결과

VIEWBAG

특징

- 데이터 타입은 Dynamic타입이고 Object.key로 선언 할 수 있습니다.

- VIEWDATA보다는 퍼포먼스 면에서는 안좋다고 합니다.

- MVC 3.0버전에서 도입되었고 상위 버전은 모두 사용 할 수 있습니다.

- .NET Framework 3.4이상에서 사용 할 수 있습니다.

- 값이 가변형이기 때문에 처음에 값을 대입 한 이후로 형변환을 할 필요가 없습니다.

- 페이지간 이동이 발생 될 때 값은 사라집니다. (컨트롤러에서부터 다시 취득 해야 함)

 

사용 예제

HomeController.cs

public IActionResult Index()
{
  // 문자형 타입
  ViewBag.str = "ViewBag입니다.";
  // 배열형 타입
  ViewBag.arr = new int[]{1,2,3} ;

  return View();
}

Index.cshtml

<!-- 문자열을 그대로 출력 할 경우 -->
<div>@ViewBag.str</div>
<!-- 변수에 담아서 사용 할 경우엔 형변환을 하지 않아도 에러가 나지 않지만 타입이 틀리면 에러가 발생합니다. -->
@{  
    string data = @ViewBag.str;
    int[] viewbag = @ViewBag.arr;
}
@for (int i = 0; i < viewbag.Length; i++)
{
    <div>@viewbag[i]</div>
}

변수에 넣을 때 타입을 잘못 지정 했을 경우

출력 결과

TEMPDATA

특징

- 데이터 타입은 Dictionary<string, object>(자바로 치면 Map)타입이고 값을 키값으로 접근 할 수 있습니다.

- MVC 1.0버전에서 도입되었고 상위 버전은 모두 사용 할 수 있습니다.

- .NET Framework 3.5이상에서 사용 할 수 있습니다.

- 값이 오브젝트형이기 때문에 형변환 처리를 해 주어야 합니다.

- 페이지간 이동이 발생 될 때 값을 유지 시킬 수 있습니다.

 

TEMPDATA는 VIEWDATA랑 거의 비슷한데 페이지 이동시에 값을 저장 해 놓을 수 있습니다.

즉 컨트롤러에서 값을 다시 호출하지 않더라도 다음 페이지에서 다이렉트로 다시 사용이 가능하다는 것입니다.

재사용은 페이지 이동 1번만 유효하며 계속 사용하고 싶으면 바뀐 페이지에도 유지시켜주는 처리를 넣어야 합니다.

 

다음 페이지에 데이터를 유지 시켜주는 방법

1. TempData.Peek()

값을 표시 함과 동시에 데이터를 저장시켜줍니다.

괄호 안에 Key를 넣어주지 않으면 해당 페이지의 모든 TempData값을 다음 페이지에 유지시켜 줍니다.

 

2. TempData.Keep()

데이터를 저장시켜주기만 합니다.

괄호 안에 Key를 넣어주지 않으면 해당 페이지의 모든 TempData값을 다음 페이지에 유지시켜 줍니다.

사용 예제

HomeController.cs

public IActionResult Index()
{
  // 문자형 타입
  TempData["TempData1"] = "TempData1입니다";
  TempData["TempData2"] = "TempData2입니다";
  TempData["TempData3"] = "TempData3입니다";
  // 배열형 타입
  TempData["TempArr"] = new int[]{1,2,3} ;

  return View();
}

Index.cshtml

<!-- 문자열을 그대로 출력 할 경우엔 형변환 하지 않아도 됩니다. -->
<div>@TempData["TempData1"]</div>
<!-- 변수에 담아서 사용 할 경우엔 형변환을 해야합니다. -->
@{  
    string data = @TempData["TempData1"].ToString();
    int[] tempdata = @TempData["TempArr"] as int[];
}
@for (int i = 0; i < tempdata.Length; i++)
{
    <div>@tempdata[i]</div>
}

<!-- 데이터 저장 테스트 -->
<h1>@TempData.Peek("TempData2")</h1>
<h1>@TempData["TempData3"]</h1>
@{
    TempData.Keep();
}

Index.cshtml출력 결과

Privacy.cshtml로 페이지 이동

HomeController.cs

public IActionResult Privacy()
{   
	// View에 리턴 할 데이터 없음
	return View();
}

Privacy.cshtml

@{
    Layout = "_Layout2";
    ViewData["Title"] = "Privacy Policy";
}
<h1>@TempData["TempData1"]</h1>
<h1>@TempData["TempData2"]</h1>
<h1>@TempData["TempData3"]</h1>
<p>Use this page to detail your site's privacy policy.</p>

Privacy.cshtml출력 결과

 

이상으로 VIEW페이지에 데이터를 가져오고 가져온 데이터를 다양하게 활용하는 방법에 대해서 알아보았습니다.

728x90
반응형