8
votes

ASP.NET MVC Le navigateur rafraîchira-t-il la tempdata inutile?

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?


0 commentaires

6 Réponses :


13
votes

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);
        }
    }


4 commentaires

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.



-1
votes

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) .


2 commentaires

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.



0
votes

Les seules fonctionnalités pouvant résoudre votre problème sont cache et session .

viewdata essentiellement "meurt" lorsque la vue est générée.

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 session ou cache .


1 commentaires

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)



2
votes

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.


1 commentaires

Cela devrait également fonctionner dans MVC2. Mais pas sûr des implications comme cela peut persister indéfiniment sinon lisez à nouveau.



25
votes

Vous devez écrire xxx

dans votre contrôleur, il conservera également ces données dans les situations de rafraîchir.


0 commentaires

1
votes

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").


0 commentaires