TempData を渡してページを初期化する新しいページにリダイレクトすると正常に動作しますが、ユーザーがブラウザの更新ボタンを押すと、TempData は使用できなくなります。これを考えると、TempData を確実に使用できる状況はありますか?
または、ユーザーの更新の問題を削除または軽減する方法はありますか?
6 に答える
あなたは書くべきです
TempData.Keep("nameofthedata");
コントローラーで、更新状況でもそのデータを保持します。
MVC 1 では、はい、キーを保存した後、次のリクエストの後に一時データが失われます。
ただし、MVC 2 では、最初にアクセスしようとすると、一時データが失われます。
とにかくTempDataが使用するSessionをいつでも使用して、一時データの損失の問題を解決できます。
MVC 2 Beta リリース ノートから:
TempDataDictionary の改善
TempDataDictionary クラスの動作は、一時データが時期尚早に削除されたか、必要以上に長く保持されたシナリオに対処するために、わずかに変更されました。たとえば、一時データが設定されたのと同じリクエストで読み取られた場合、一時データを削除する意図があったとしても、次のリクエストまで一時データが保持されていました。他のケースでは、複数の連続したリダイレクトで一時データが保持されませんでした。
これらのシナリオに対処するために、TempDataDictionary オブジェクトからキーが読み取られるまですべてのキーが無期限に存続するように、TempDataDictionary クラスが変更されました。Keep メソッドが TempDataDictionary に追加され、読み取り後に値を削除してはならないことを示すことができます。RedirectToActionResult は、次の要求のためにすべてのキーを保持するために Keep メソッドが呼び出される例です。
MVC 2 ソースを直接見て、これらの変更を確認することもできます。
MVC1:
public object this[string key] {
get {
object value;
if (TryGetValue(key, out value)) {
return value;
}
return null;
}
set {
_data[key] = value;
_modifiedKeys.Add(key);
}
}
MVC2:
public object this[string key] {
get {
object value;
if (TryGetValue(key, out value)) {
_initialKeys.Remove(key);
return value;
}
return null;
}
set {
_data[key] = value;
_initialKeys.Add(key);
}
}
MVC1 の特定の状況の回避策は、2 番目のコントローラーでも TempData を再割り当てすることです。もちろん、システム内のデータはもう少し長く保持されます。ただし、更新の問題は修正されます。
Tempdataはリダイレクト全体で使用されるため、ページを更新している場合、サーバーに別のリクエストを行っていることを意味するため、データが失われます. このデータを保持するには、リダイレクト先のアクションで Tempdata.Keep("KeyofTempdata") メソッドを呼び出します。データを削除する場合は、Tempdata.Remove("KeyofTempdata") を使用します。
問題を解決できる機能は と だけCache
ですSession
。
ViewData
ビューが生成されると、本質的に「消滅」します。
達成しようとしていることの詳細を提供できる場合は、別の解決策を提供できる可能性がありますが、Session
またはを使用するのが最適なオプションのようですCache
。
TempData は、1 つのページの読み込み/アクション/リダイレクトのデータを格納するために特別に存在します。更新後にデータを保持する必要がある場合は、更新要求を処理しているアクションが最初に要求されたものと同じである限り、データを ViewData コレクションに配置する必要があります (つまり、リダイレクトの前に ViewData 値が追加されていません)。 .