asp.net-mvc
ViewData, ViewBag, TempData
수색…
소개
ViewData
및 ViewBag
는 컨트롤러에서보기로 데이터를 전송하는 데 사용됩니다.
ViewData는 객체의 사전 일 뿐이며 문자열로 키로 액세스 할 수 있습니다.
ViewBag는 ViewData와 매우 유사합니다. ViewBag는 동적 속성입니다. ViewBag는 ViewData 주변의 래퍼 일뿐입니다.
TempData는 HTTP 요청 시간에 대한 데이터를 유지합니다. 즉, 두 개의 연속 요청간에 데이터를 보유합니다. TempData는 컨트롤러간에 또는 작업간에 데이터를 전송하는 데 도움이됩니다. 내부적으로 세션을 사용합니다.
통사론
ViewData [키] = 값;
ViewBag.Key = 값;
TempData [key] = 값;
ViewData, ViewBag 및 TempData 란 무엇입니까?
ViewData 는 컨트롤러가 ViewModel을 사용하지 않고 컨트롤러가 제공하는 뷰에 데이터를 제공하는 메커니즘입니다. 특히 ViewData는 MVC 작업 메서드 및 뷰에서 사용할 수있는 사전입니다. ViewData를 사용하여 작업 메서드의 일부 데이터를 작업 메서드에서 반환 한 뷰로 전송할 수 있습니다.
사전이므로 사전과 같은 구문을 사용하여 데이터를 설정하고 가져올 수 있습니다.
ViewData[key] = value; // In the action method in the controller
예를 들어, 인덱스 작업 메서드에서 Index 뷰 Index.cshtml
로 문자열 메시지를 전달하려면이 작업을 수행 할 수 있습니다.
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC";
return View(); // notice the absence of a view model
}
Index.cshtml
뷰에서이 항목에 액세스하려면 작업 메소드에 사용 된 키로 ViewData 사전에 액세스하기 만하면됩니다.
<h2>@ViewData["Message"]</h2>
ViewBag 는 타입이 지정되지 않은 ViewData 사전과 동적으로 동일합니다. 구문적인 설탕 경험을 위해 C # dynamic
유형을 이용합니다.
일부 데이터를 ViewBag에 설정하는 구문은 다음과 같습니다.
ViewBag.Key = Value;
따라서 이전 예제에서 ViewBag를 사용하여 메시지 문자열을 전달하려는 경우
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC";
return View(); // not the absence of a view model
}
색인보기에서
<h2>@ViewBag.Message</h2>
데이터는 ViewBag와 ViewData간에 공유되지 않습니다. ViewData는 복잡한 데이터 유형에서 데이터를 가져 오기 위해 유형 캐스팅이 필요하며 View Bag이 타입 캐스팅을 필요로하지 않는 경우 오류를 방지하기 위해 null 값을 확인해야합니다.
TempData 는 한 HTTP 요청과 다음 HTTP 요청 사이에서만 데이터를 유지하려는 경우에 사용할 수 있습니다. TempDataDictionary에 저장된 데이터의 수명은 두 번째 요청 후에 끝납니다. 따라서 TempData는 PRG 패턴을 따르는 시나리오에서 유용합니다.
[HttpPost]
public ActionResult Create(string name)
{
// Create a user
// Let's redirect (P-R-G Pattern)
TempData["Message"] = "User created successfully";
return RedirectToAction("Index");
}
public ActionResult Index()
{
var messageFromPreviousCall = TempData["Message"] as String;
// do something with this message
// to do : Return something
}
return RedirectToAction("SomeActionMethod")
하면 서버는 위치 헤더 값이 "SomeActionMethod"로 설정된 클라이언트 (브라우저)에 302 응답을 보내고 브라우저는 완전히 새로운 요청을합니다. 이 경우 ViewBag / ViewData는이 두 호출간에 일부 데이터를 공유하지 않습니다. 이러한 시나리오에서는 TempData를 사용해야합니다.
TempData 수명주기
TempData에 저장된 데이터는 세션에 저장되며 데이터에 액세스하는 첫 번째 요청이 끝날 때 자동으로 제거됩니다. 읽어 본 적이 없다면 마지막으로 읽거나 세션 시간이 초과 될 때까지 유지됩니다.
일반적인 사용법은 다음 순서와 같습니다 (각 줄은 다른 요청에서 호출됩니다).
//first request, save value to TempData
TempData["value"] = "someValueForNextRequest";
//second request, read value, which is marked for deletion
object value = TempData["value"];
//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null
이 동작은 Peek
및 Keep
메서드를 사용하여 추가 컨트롤러가 될 수 있습니다.
Peek
를 사용하면 삭제 표시없이 TempData에 저장된 데이터를 검색 할 수 있으므로 이후 요청시에도 데이터를 사용할 수 있습니다.//first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, PEEK value so it is not deleted at the end of the request object value = TempData.Peek("value"); //third request, read value and mark it for deletion object value = TempData["value"];
Keep
키를 사용하면 삭제 표시된 키를 실제로 유지하도록 지정할 수 있습니다. 이 경우 데이터를 검색하고 삭제에서 저장하는 데는 다음 두 가지 메소드 호출이 필요합니다.//first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, get value marking it from deletion object value = TempData["value"]; //later on decide to keep it TempData.Keep("value"); //third request, read value and mark it for deletion object value = TempData["value"];
이를 염두에두고 Peek
사용하면 다른 요청에 대한 값을 항상 유지하고 값을 유지할 때 추가 논리에 따라 Keep
사용합니다.