2014-01-21 146 views
42

keep()和peek()之間的區別是什麼?TempData keep()vs peek()

MSDN說:

  • 保持():marks the specified key in the dictionary for retention.
  • PEEK():returns an object that contains the element that is associated with the specified key, without marking the key for deletion.

我不能得到真正的區別是什麼,難道他們都保持另一個請求的價值?

回答

88

當在TempDataDictionary的對象被讀取時,它會被標記爲在末端缺失的要求。

,如果你把東西對TempData的像

TempData["value"] = "someValueForNextRequest"; 

而且你訪問另一個請求,該值將在那裏,但只要你讀它,價值會被標記爲刪除這意味着:

//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

//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你指定被標記爲要保留刪除的關鍵。檢索對象並稍後保存以免被刪除是兩個不同的調用。見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取決於附加邏輯。

你有2個約TempData的工作原理here好的問題和here

希望它能幫助!

+0

非常感謝!它現在超級清晰:) –

+0

什麼時候刪除實際發生?因此,如果在閱讀之後標記爲刪除,然後我做了其他一些操作,並決定使用保留,只要我發起了重定向,它會保證在哪裏? – eaglei22

+0

在執行結果和所有過濾器後,它將在當前請求結束時被刪除。只要你使用[base controller class](https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Controller.cs),檢查'TempData.Save'的用法那麼 –

1

他們都不會爲另一個請求保留一個值嗎?

是他們這樣做,但是當第一個是void,第二個回報和object

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和Keep並最初有同樣的困惑。由於TempData在不同條件下的行爲不同,因此出現了混淆。您可以觀看這部影片,這也解釋了保持與示範https://www.facebook.com/video.php?v=689393794478113

TempData的幫助保存值單個請求和也保留值爲根據4個條件下一個請求」偷看。

如果我們理解了這4點,你會看到更多的清晰度。下面是一個包含所有4個條件的圖表,閱讀關於Peek和Keep的第三和第四點。

enter image description here

條件1(不讀): -如果設置了「TempData的」你的行動中,如果你沒有在您的視圖讀它,然後「TempData的」將持續爲下一個請求。

條件2(正常讀取): -如果您通常讀取「TempData」,就像下面的代碼一樣,它不會持續用於下一個請求。

string str = TempData[「MyData」]; 

即使您正在顯示它是一個正常的閱讀,如下面的代碼。

@TempData[「MyData」]; 

條件3(閱讀並保留): -如果你看過「TempData的」,並呼籲「保持」的方法將被保留。

@TempData[「MyData」]; 
TempData.Keep(「MyData」); 

條件4(PEEK和閱讀): -如果使用了「窺視」的方法,將持續爲下一個請求讀「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 Peek標記保留的關鍵,以便數據將一直保留到下一個請求。 – Adrian

5

TempData的也是一個字典對象停留一個 HTTP請求的時間。所以,TempData可用於維護控制器動作與其他控制器動作之間的數據。

TempData用於每次檢查空值。 TempData包含 兩種方法keep()和peek(),用於將數據狀態從一個控制器動作維持到其他控制器動作。

TempDataDictionary對象被讀取,在請求標記 的末尾作爲當前讀取對象的刪除。

保持()PEEK()方法使用沒有缺失 當前讀取的對象來讀取數據。

您可以使用Peek()當您總是想要保留/阻止 的值的另一個請求。您可以使用Keep()當防止/保留值 取決於其他邏輯。

在TempData.Peek重載()& TempData.Keep()如下面給出的。

TempData.Keep()有2個重載的方法。

  1. 無效保持():這一威脅的所有數據不能在當前請求完成刪除。

  2. 無效保持(字符串鍵):堅持具體項目中的TempData與名稱的幫助。

TempData.Peek()沒有過載的方法。

  1. 對象偷看(字符串鍵):返回包含特定鍵值項未做鍵刪除的對象。

返回類型爲TempData.Keep()的示例& TempData.Peek()方法如下所示。

公共無效保持(字符串鍵){ _retainedKeys.Add(鍵); }

公共對象Peek(字符串鍵){0} {0} {0} {object value = values; 返回值; }

+0

第一段的可能來源:[前10個ASP.NET MVC面試問題](http://www.codeproject.com/Articles/653746/Top-ASP-NET-MVC-Interview-Questions),「* TempData也是一個保存HTTP請求時間的字典對象,因此,Tempdata可以用來維護重定向之間的數據,即從一個控制器到另一個控制器。*「 – 2015-10-08 05:19:15