Différence entre ViewData et TempData?

94

Je sais ce qu'est ViewData et je l'utilise tout le temps, mais dans ASP.NET Preview 5, ils ont introduit quelque chose de nouveau appelé TempData.

Normalement, je tape fortement mon ViewData, au lieu d'utiliser l'approche du dictionnaire des objets.

Alors, quand dois-je utiliser TempData au lieu de ViewData?

Existe-t-il des meilleures pratiques pour cela?

Manoir Elijah
la source
Je voudrais ajouter quelque chose à propos TempDataici stackoverflow.com/a/17199709/2015869
Imad Alazani

Réponses:

94

En une phrase: TempDatasont comme ViewData avec une différence: ils ne contiennent des données qu'entre deux requêtes successives, après quoi ils sont détruits. Vous pouvez utiliser TempDatapour transmettre des messages d'erreur ou quelque chose de similaire.

Bien que obsolète, cet article présente une bonne description du TempDatacycle de vie.

Comme Ben Scheirman l'a dit ici :

TempData est un dictionnaire de stockage temporaire sauvegardé par session qui est disponible pour une seule demande. C'est génial de passer des messages entre les contrôleurs.

Dragan Panjkov
la source
Je pense que c'est une assez grande différence, en ce sens que TempDatacela impliquera quelque chose de potentiellement beaucoup plus compliqué (la session) qu'un simple dictionnaire transmis de méthode en méthode
Matti Virkkunen
29

Lorsqu'une action renvoie un résultat RedirectToAction, elle provoque une redirection HTTP (équivalente à Response.Redirect). Les données peuvent être conservées dans la propriété TempData (dictionnaire) du contrôleur pour la durée d'une seule demande de redirection HTTP.

Capitaine Sensible
la source
La valeur de ViewData sera-t-elle conservée dans le même cas?
IsmailS
9
@Ismail: Non, ViewData ne conservera pas les données via la redirection. C'est la principale différence de TempData.
Mariano Desanze
5

Afficher les données:

  • ViewData est un type de dictionnaire public ViewDataDictionary ViewData { get; set; }
  • Il peut être utilisé pour transmettre des données du contrôleur à la vue, dans un seul sens
  • C'est la vie ne réside que pendant la demande actuelle
  • Si vous passez une chaîne, pas besoin de transtyper
  • Si vous passez un objet, vous devez le transtyper mais avant cela, vous devez vérifier s'il n'est pas nul
  • C'est une propriété sur ControllerBase, qui est le parent de la Controllerclasse

TempData:

  1. TempData utilisation en interne TempDataDictionary :public TempDataDictionary TempData { get; set; }
  2. Une fois les données enregistrées dans TempDataDictionary objet:
    • Il y persiste et peut être lu depuis n'importe quelle vue ou n'importe quelle action dans n'importe quel contrôleur
    • Il ne peut être lu qu'une seule fois; une fois lu, il devient nul
    • Il est enregistré dans la session de sorte qu'à l'expiration de la session, les données sont perdues.

Ce comportement est nouveau à partir d'ASP.NET MVC 2 et des dernières versions. Dans les versions antérieures d'ASP.NET MVC, les valeurs de TempDatan'étaient disponibles que jusqu'à la demande suivante.

  1. Il est vivant, jusqu'à ce qu'il soit lu ou que la session expire et puisse être lu de n'importe où.

Voir la comparaison de ViewData, ViewBag, TempData et Session dans MVC en détail

Ali Adravi
la source
0

view data est utilisé lorsque nous voulons transmettre des données du contrôleur à la vue correspondante. les données d'affichage ont une durée de vie très courte, cela signifie qu'elles seront détruites lors de la redirection. Exemple (contrôleur):

public ViewResult try1()
    {
        ViewData["DateTime"] = DateTime.Now;
        ViewData["Name"] = "Mehta Hitanshi";
        ViewData["Twitter"] = "@hitanshi";
        ViewData["City"] = "surat";
        return View();
    }

try1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@ViewData["Name"]</td>
    <td>@ViewData["Twitter"]</td>
    <td>@ViewData["City"]</td>
</tr>
</table> 

TempData transfère les données entre les contrôleurs ou entre les actions. Il est utilisé pour stocker des messages uniques et sa durée de vie est très courte.Nous pouvons utiliser TempData.Keep () pour le rendre disponible à travers toutes les actions ou pour le rendre persistant.

Exemple (contrôleur):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "[email protected]";
        TempData["City"] = "India";
        TempData["MobNo"] = 9998975436;
        return RedirectToAction("TempView1");
    }
    public ActionResult TempView1()
    {
        return View();
    }

TempView1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@TempData["Name"]</td>
    <td>@TempData["Twitter"]</td>
    <td>@TempData["Email"]</td>
    <td>@TempData["City"]</td>
    <td>@TempData["MobNo"]</td>
</tr>
</table>
Hitanshi Mehta
la source