2014-01-21 101 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

が、それは最後に削除対象としてマークされますその要求のあなたは

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

はあなたが維持したい削除のマークが付けられたキーを指定します。オブジェクトの取得とそれ以降の削除からの保存は、2つの異なる呼び出しです。あなたはいつも別の要求のための値を保持したいときは、Peekを使用することができます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"]; 

を参照してください。値を保持する場合は、追加のロジックに応じてKeepを使用します。

あなたはTempDataをがherehere

それがお役に立てば幸いですがどのように機能するかについて2つの良い質問があります!

+0

ありがとうございます!それは今非常にクリアされています:) –

+0

削除は実際にいつ発生しますか?したがって、読み込み後に削除マークが付いていて、次に他のものを実行し、キープを使用することに決めた場合、リダイレクトを開始している限り、それは保証されますか? – eaglei22

+0

結果とすべてのフィルタが実行された後、現在の要求の最後に削除されます。これは、[ベースコントローラクラス](https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Controller.cs)を使用している限り、「TempData.Save」の使用法をチェックしますそこには –

1

どちらも別のリクエストの値を保持していませんか?

はい彼らは、しかし、最初のものは二番目の戻りobjectvoidとき: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が異なる条件下で異なって動作するために発生します。あなたはTempDataを、単一の要求との値も「4条件に応じて、次の要求の値を保持することができます保存することができますhttps://www.facebook.com/video.php?v=689393794478113

デモをキープし、のぞき見を説明し、このビデオを見ることができます。

この4つのポイントを理解すると、より明確になります。下図は、4つの条件すべてを示したダイアグラムです.Peek and Keepについて語る第3および第4のポイントを読んでください。

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"メソッドは次のリクエストで保持され、次のリクエストまたは3番目のリクエストでは "Keep"メソッドが保持されません。 – stom

+0

@stom次のリクエストまでデータが保持されるように、保持キーをピックマークしてください。 – Adrian

5

TempDataをも HTTPリクエストの時間のためにとどまる辞書オブジェクトです。したがって、TempDataを使用して、1つのコントローラアクションと他のコントローラアクションの間のデータを維持することができます。

TempDataは、毎回NULL値をチェックするために使用されます。 TempDataには コントローラーアクションから他のコントローラーアクションへのデータ状態を維持するための2つのメソッドkeep()とpeek()が含まれています。

TempDataDictionaryオブジェクトが読み取られたとき、要求マークの最後に、現在の読み取りオブジェクトに削除として が削除されました。

キープ()PEEK()方法を削除 現在読み出し対象せずにデータを読み出すために使用されます。

Peek()は、別のリクエストの の値を常に保持/防止したい場合に使用できます。 の値を防止または保持する場合は、追加のロジックに応じて、Keep()を使用できます。下記のようにTempData.Peekに過負荷

()& TempData.Keep()

TempData.Keep()には、2つのオーバーロードされたメソッドがあります。

  1. 無効)(を保つ:その脅威を、現在の要求の完了時に削除されていないすべてのデータ。

  2. のボイド(文字列キー)を保つ:名前の助けを借りてTempDataをして特定の項目を持続。

TempData.Peek()ないオーバーロードされたメソッド。

  1. オブジェクトのぞく(文字列キー):削除のためにキーをすることなく、特定のキーを持つ項目が含まれているオブジェクトを返します。

TempData.Keep()の戻り型の例& TempData.Peek()メソッドは以下のとおりです。

ます。public void { _retainedKeys.Add(キー)(文字列キー)をしてください。 }

公開オブジェクトピーク(文字列キー){ オブジェクト値=値; 戻り値。 }

+0

最初の段落の可能なソース:[Top 10 ASP.NET MVCインタビュー質問](http://www.codeproject.com/Articles/653746/Top-ASP-NET-MVC-Interview-Questions)、 "* TempDataもHTTPリクエストの時間にとどまる辞書オブジェクトです。したがって、Tempdataを使用して、あるコントローラから他のコントローラへのリダイレクト間のデータを維持することができます。* " –