Si je redirige vers une nouvelle page passant des tempdata pour initialiser la page, cela fonctionne bien, si l'utilisateur appuie sur le bouton Actualiser dans son navigateur, les tempdata ne sont pas disponibles.
Compte tenu de cela, y a-t-il une situation où les tempdata pourraient être utilisées de manière fiable?
Ou tout moyen de supprimer ou d'atténuer le problème des utilisateurs rafraîchissant? P>
6 Réponses :
dans mvc 1, oui, les données TEMP sont perdues après la demande suivante après que vous stockiez une clé.
avec MVC 2 Cependant, les données TEMP sont perdues après la première tentative d'y accéder. P>
Vous pouvez toujours utiliser la session, que TempData utilise de toute façon, pour résoudre le problème de perte de données Temp de votre ayant. P>
à partir des notes de version bêta MVC 2: stry> P> Améliorations de Tempdatadication P>
Le comportement du tempdadidictionner
La classe a légèrement changé pour
Adresse des scénarios où les données temporaires étaient
soit retiré prématurément ou
persisté plus longtemps que nécessaire. Pour
exemple, dans les cas où les données TEMP étaient
lire dans la même demande dans laquelle il
a été défini, les données TEMP persistaient
pour la prochaine demande même si le
l'intention était de le supprimer. En d'autre
Cas, les données TEMP n'ont pas été persistées
sur plusieurs redirections consécutives. P>
Pour résoudre ces scénarios, le
La classe templicieugicalisation a été modifiée
de sorte que toutes les clés survivent
indéfiniment jusqu'à ce que la clé soit lue
de l'objet tempdadique.
La méthode de garde a été ajoutée à
Tempdadictionner pour vous permettre d'indiquer
que la valeur ne doit pas être supprimée
après avoir lu. Les
RedirecttoActionResult est un exemple
où la méthode de garde est appelée
afin de conserver toutes les clés de la
demande suivante. P>
BlockQuote> Vous pouvez également regarder directement dans la source MVC 2 pour voir ces modifications: P> MVC 1: P>
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);
}
}
Il est basé sur l'accès à la valeur maintenant? J'ai manqué que Changelog.
Ouais, pouvez-vous fournir une référence pour que les tempdata soient perdues lors de la première tentative d'accès?
@Nathan Taylor @baddie, espérons que mon édition et mes citations suppriment vos préoccupations.
Excellent. Ne savait pas ce changement.
TEMPDATA existe spécifiquement pour stocker les données pour une seule page de charge / action / redirection. Si vous avez besoin des données pour persister après un rafraîchissement, vous devez la placer dans la collection ViewData tant que l'action qui servant la demande de rafraîchissement est la même que celle initialement demandée (c.-à-d. La valeur ViewData n'a pas été ajoutée avant une redirection) . P>
Votre déclaration sur la persistance des données à l'aide de ViewData est incorrecte. La portée de ViewData se termine lorsque la vue est générée. Rafraîchissant Simple Reruns L'action et la viewdata est régénérée, rien ne persiste.
J'ai peut-être obscurci mon sens avec comment je l'ai expliqué. J'impliquais que la valeur serait reformulée à ViewData à titre d'actualisation.
Les seules fonctionnalités pouvant résoudre votre problème sont Si vous pouvez fournir plus de détails sur ce que vous essayez d'accomplir, une autre solution peut peut-être être donnée, mais il semble que la meilleure option pour vous soit d'utiliser cache code> et
session code>. p>
viewdata code> essentiellement "meurt" lorsque la vue est générée. p>
session code> ou
cache code>. p>
En fin de compte, j'ai pris une approche complètement différente et j'ai adopté les données sur la chaîne de requête (ce n'était que quelques variables mais qui ne sont toujours pas la solution la plus élégante)
Une solution de contournement pour la situation donnée dans MVC1 serait de ré-attribuer la tempdata dans le deuxième contrôleur. Bien sûr, il persiste les données du système un peu plus de temps. Mais il corrige le problème de rafraîchissement. P>
Cela devrait également fonctionner dans MVC2. Mais pas sûr des implications comme cela peut persister indéfiniment sinon lisez à nouveau.
Vous devez écrire dans votre contrôleur, il conservera également ces données dans les situations de rafraîchir. p> p>
Tempdata est utilisé sur les redirects, donc si vous vous rafraîchissez la page qui signifie que vous faites une demande séparée sur le serveur, c'est pourquoi vos données sont perdues. Pour persister ces données, appelez la méthode Tempdata.keep ("KeNoftempdata") dans l'action auquel vous redirection. Si vous souhaitez supprimer les données, utilisez TEMPDATA.REMOVE ("KeNoftempData"). P>