수색…


소개

ViewDataViewBag 는 컨트롤러에서보기로 데이터를 전송하는 데 사용됩니다.

ViewData는 객체의 사전 일 뿐이며 문자열로 키로 액세스 할 수 있습니다.

ViewBag는 ViewData와 매우 유사합니다. ViewBag는 동적 속성입니다. ViewBag는 ViewData 주변의 래퍼 일뿐입니다.

TempData는 HTTP 요청 시간에 대한 데이터를 유지합니다. 즉, 두 개의 연속 요청간에 데이터를 보유합니다. TempData는 컨트롤러간에 또는 작업간에 데이터를 전송하는 데 도움이됩니다. 내부적으로 세션을 사용합니다.

통사론

  1. ViewData [키] = 값;

  2. ViewBag.Key = 값;

  3. 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

이 동작은 PeekKeep 메서드를 사용하여 추가 컨트롤러가 될 수 있습니다.

  • 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 사용합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow