web-dev-qa-db-ja.com

TempData keep()vs peek()

Keep()とpeek()の違いは何ですか?

MSDNによると:

  • keep():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.

私は違いが本当に何であるかを知ることができません、彼らは両方とも別のリクエストのために値を保持していませんか?

59
Ghasan

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

それが役に立てば幸い!

120
Daniel J.G.

ピークとキープの理解を終えたばかりで、最初は同じ混乱がありました。 TempDataが異なる条件下で異なる動作をするため、混乱が生じます。 KeepとPeekをデモで説明するこのビデオを見ることができます https://www.facebook.com/video.php?v=68939379447811

Tempdataは、単一のリクエストの値を保存するのに役立ち、CANは、4条件に応じて次のリクエストの値も保存します4条件」。

これらの4つのポイントを理解すると、より明確になります。以下は4つの条件すべてを含む図です。ピークとキープについて説明する3番目と4番目のポイントをお読みください。

enter image description here

条件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

42

TempDataは、HTTPリクエストの時間だけ保持される辞書オブジェクトでもあります。したがって、TempDataを使用して、1つのコントローラーアクションから別のコントローラーアクションまでのデータを維持できます。

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

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

keep()およびpeek()メソッドは、現在の読み取りオブジェクトを削除せずにデータを読み取るために使用されます。

Peek()は、別のリクエストの値を常に保持/防止したい場合に使用できます。値の防止/保持が追加のロジックに依存する場合、Keep()を使用できます。

TempData.Peek()およびTempData.Keep()でのオーバーロード以下に示すとおり

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

  1. voidkeep():現在のリクエストの完了時に削除されないすべてのデータを脅かす。

  2. voidkeep(string key):名前の助けを借りてTempDataの特定のアイテムを永続化します。

TempData.Peek()オーバーロードされたメソッドはありません。

  1. objectpeek(string key):削除用のキーを作成せずに、特定のキーを持つアイテムを含むオブジェクトを返します。

TempData.Keep()およびTempData.Peek()メソッドの戻り型の例を以下に示します。

public voidKeep(string key){_retainedKeys.Add(key); }

パブリックオブジェクトPeek(string key){object value = values;戻り値; }

5
Anil Singh

彼らは両方とも別のリクエストの値を保持していませんか?

はい。ただし、最初のものが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
}
1
Zabavsky