Keep()と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.
私は違いが本当に何であるかを知ることができません、彼らは両方とも別のリクエストのために値を保持していませんか?
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
Peek
メソッドとKeep
メソッドを使用すると、削除のマークを付けずに値を読み取ることができます。値がTempDataに保存された最初の要求に戻ったとします。
Peek
を使用すると、1回の呼び出しで削除のマークを付けずに値を取得できます。 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
を使用して、削除するマークが付けられたキーを指定します。オブジェクトを取得し、後で削除から保存すると、2つの異なる呼び出しが行われます。 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の仕組みについて2つの良い質問があります here および here
それが役に立てば幸い!
ピークとキープの理解を終えたばかりで、最初は同じ混乱がありました。 TempDataが異なる条件下で異なる動作をするため、混乱が生じます。 KeepとPeekをデモで説明するこのビデオを見ることができます https://www.facebook.com/video.php?v=68939379447811
Tempdataは、単一のリクエストの値を保存するのに役立ち、CANは、4条件に応じて次のリクエストの値も保存します4条件」。
これらの4つのポイントを理解すると、より明確になります。以下は4つの条件すべてを含む図です。ピークとキープについて説明する3番目と4番目のポイントをお読みください。
条件1(未読):-アクション内で「TempData」を設定し、ビューでそれを読み込まない場合は「TempData」次のリクエストのために永続化されます。
条件2(通常読み取り):-以下のコードのように「TempData」を通常に読み取った場合、次のリクエストでは持続しません。
string str = TempData[“MyData”];
表示している場合でも、以下のコードのような通常の読み取りです。
@TempData[“MyData”];
条件3(読み取りと保持):-「TempData」を読み取り、「Keep」メソッドを呼び出すと、永続化されます。
@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
TempDataは、HTTPリクエストの時間だけ保持される辞書オブジェクトでもあります。したがって、TempDataを使用して、1つのコントローラーアクションから別のコントローラーアクションまでのデータを維持できます。
TempDataは、毎回ヌル値をチェックするために使用されます。 TempDataには、1つのコントローラーアクションから別のコントローラーアクションへのデータ状態を維持するための2つのメソッドkeep()およびpeek()が含まれています。
TempDataDictionaryオブジェクトが読み取られると、要求の最後に、現在の読み取りオブジェクトへの削除としてマークが付けられます。
keep()およびpeek()メソッドは、現在の読み取りオブジェクトを削除せずにデータを読み取るために使用されます。
Peek()は、別のリクエストの値を常に保持/防止したい場合に使用できます。値の防止/保持が追加のロジックに依存する場合、Keep()を使用できます。
TempData.Peek()およびTempData.Keep()でのオーバーロード以下に示すとおり
TempData.Keep()には2つのオーバーロードメソッドがあります。
voidkeep():現在のリクエストの完了時に削除されないすべてのデータを脅かす。
voidkeep(string key):名前の助けを借りてTempDataの特定のアイテムを永続化します。
TempData.Peek()オーバーロードされたメソッドはありません。
TempData.Keep()およびTempData.Peek()メソッドの戻り型の例を以下に示します。
public voidKeep(string key){_retainedKeys.Add(key); }
パブリックオブジェクトPeek(string key){object value = values;戻り値; }
彼らは両方とも別のリクエストの値を保持していませんか?
はい。ただし、最初のものがvoid
である場合、2番目のものは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
}