2014-01-21 2 views
42

keep()과 peek()의 ​​차이점은 무엇입니까?TempData keep() vs peek()

MSDN 말한다 :

  • 킵() : marks the specified key in the dictionary for retention.
  • 들여다() : returns an object that contains the element that is associated with the specified key, without marking the key for deletion.

정말 차이가 무엇 얻을 수 없다, 둘은 보관하지 않습니다 다른 요청에 대한 가치?

답변

88

, 그것은 마지막에 삭제 표시됩니다 그 요청의. 삭제는

TempData["value"] = "someValueForNextRequest"; 

처럼 TempData에 뭔가를 넣어 그리고 당신이 그것을 액세스 다른 요청에 값이있을 것입니다하지만 최대한 빨리 당신이 그것을 읽을 때, 값이 표시 될 경우 의미

:

//second request, read value and 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 방법은 당신이 삭제를 표시하지 않고 값을 읽을 수 있습니다. TempData에 값이 저장된 첫 번째 요청으로 돌아 가자.

Peek 사용하면 하나의 호출로 삭제를 표시하지 않고 값을 얻을 msdn를 참조하십시오 Keep

//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"]; 

당신은 유지하려는 삭제 표시가 된 키를 지정합니다. 객체를 가져오고 나중에 삭제에서 저장하는 것은 두 가지 다른 호출입니다. 당신은 항상 다른 요청에 대한 값을 유지하고자 할 때 msdn

//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을 사용하십시오.

당신이 좋은 TempData가 here를 작동하는 방법에 대한 질문과 here

는 희망이 도움이!

+0

고마워요! 이제 매우 깨끗합니다 :) –

+0

삭제는 실제로 언제 발생합니까? 따라서 읽은 후에 삭제 표시가 된 다음 다른 물건을 사용하고 보관을 사용하기로 결정한 경우 리디렉션을 시작한 한 주변에있을 수 있습니다. – eaglei22

+0

결과와 모든 필터가 실행 된 후 현재 요청이 끝날 때 삭제됩니다. 이것은 [기본 컨트롤러 클래스] (https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Controller.cs)를 사용하는 동안, 'TempData.Save'의 사용법을 확인하십시오. 거기에 –

1

둘 다 다른 요청에 대한 가치를 유지하지 않습니까?

예 그들은 할 수 있지만, 첫 번째는 void, 두 번째 반환 및 object을 때하십시오 TempDataDictionary의 객체를 읽을 때

public void Keep(string key) 
{ 
    _retainedKeys.Add(key); // just adds the key to the collection for retention 
} 

public object Peek(string key) 
{ 
    object value; 
    _data.TryGetValue(key, out value); 
    return value; // returns an object without marking it for deletion 
} 
34

처음에는 Peek and Keep을 이해하고 처음에는 동일한 혼란을 겪었습니다. TempData가 다른 조건에서 다르게 작동하기 때문에 혼란이 발생합니다. 당신은 보관할 설명이 비디오를 시청하고 https://www.facebook.com/video.php?v=689393794478113

Tempdata가 하나의 요청에 대한 값을 보존하고 4 조건을에 따라 다음 요청 "에 대한 값을을 보존 할 수 있습니다 시연 들여다 수 있습니다.

이 4 가지 사항을 이해하면 더 명확하게 볼 수 있습니다. 아래 그림은 네 가지 조건이 모두 포함 된 다이어그램으로, 핍 및 유지에 대해 이야기하는 세 번째 및 네 번째 내용을 읽습니다.

enter image description here

조건 1 (읽기되지 않음) : - 당신은 당신의 행동 안에 "TempData"을 설정하고보기에 그것을 읽지 않는 경우 다음 "TempData"이 다음 요청을 지속 할 경우 .

조건 2 (일반 읽기) : - "TempData"를 읽으면 다음 코드와 같이 정상적으로 유지되지 않습니다.

string str = TempData[“MyData”]; 

표시하는 경우에도 아래 코드와 같이 정상적으로 표시됩니다.

@TempData[“MyData”]; 

조건 3 (읽기 및 유지) -는 "TempData"를 읽고이 지속 될 것 "유지"메소드를 호출합니다.

@TempData[“MyData”]; 
TempData.Keep(“MyData”); 

조건 4 (픽 및 읽기) : - 당신이 다음 요청 지속될 것 "픽"방법을 사용하여 "TempData"를 읽어 보면.

string str = TempData.Peek("Td").ToString(); 

참조 : - http://www.codeproject.com/Articles/818493/MVC-Tempdata-Peek-and-Keep-confusion

+0

그래서 "Peek"메서드는 다음 요청에 대해 계속 유지되며 "Keep"메서드는 다음 요청이나 세 번째 요청에 대해 유지되지 않습니다. 그렇습니까? – stom

+0

@stom 다음 요청까지 데이터가 유지 될 수 있도록 유지 키를 누르십시오. – Adrian

5

TempData 또한 HTTP 요청의 시간 동안 유지 사전 개체입니다. 따라서 TempData를 사용하여 다른 컨트롤러 동작에 대한 컨트롤러 동작과 컨트롤러 동작 간의 데이터를 유지 관리 할 수 ​​있습니다.

TempData은 매번 null 값을 확인하는 데 사용됩니다. TempData에는 컨트롤러 동작에서 다른 동작으로 데이터 상태를 유지 관리하는 두 가지 방법 인 keep() 및 peek()이 포함되어 있습니다.

TempDataDictionary 개체가 읽혀질 때 요청 끝에 을 현재 읽기 개체로 삭제 표시합니다.

KEEP() 및PEEK() 메소드는 삭제 현재 판독 대상없이 데이터를 판독하는 데 사용된다.

Peek()은 항상 다른 요청을 에 대한 값을 보류/금지하려는 경우 사용할 수 있습니다. 값을 방지/유지할 때 추가 논리에 따라 Keep()을 사용할 수 있습니다. 아래와 같이 TempData.Peek 오버로딩

() & TempData.Keep().

TempData.Keep()에는 두 가지 오버로드 된 메서드가 있습니다.

  1. 무효 () 유지 : 그 위협의 모든 데이터는 현재 요청 완료에 삭제되지 않습니다. 이름의 도움으로 TempData에서 특정 항목을 계속 :

  2. 무효 은 (문자열 키) 유지.

TempData.Peek()없이 오버 방법.

  1. 객체 들여다 (문자열 키) : 삭제 키를하지 않고 특정 키와 항목이 포함 된 객체를 반환합니다.

반환 유형의 TempData.Keep() & TempData.Peek() 메소드는 다음과 같습니다.

공공 무효 { _retainedKeys.Add (키) (문자열 키)를 유지; }

공개 대상 엿보기 (문자열 키) { 개체 값 = 값; 반환 값; }

+0

첫 번째 단락의 가능한 출처 : [Top 10 ASP.NET MVC 인터뷰 질문] (http://www.codeproject.com/Articles/653746/Top-ASP-NET-MVC-Interview-Questions), "* TempData도 HTTP 요청시 유지되는 사전 객체입니다. 따라서 Tempdata는 한 컨트롤러에서 다른 컨트롤러로 리디렉션 사이의 데이터를 유지하는 데 사용할 수 있습니다. * " –