101 votes

Différence entre ViewData et TempData ?

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 mes ViewData, au lieu d'utiliser l'approche du dictionnaire d'objets.

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

Existe-t-il des bonnes pratiques en la matière ?

0 votes

Je voudrais ajouter quelque chose à propos de TempData aquí stackoverflow.com/a/17199709/2015869

99voto

Dragan Panjkov Points 2145

En une phrase : TempData sont similaires aux ViewData, à une différence près : Ils ne contiennent des données qu'entre deux requêtes successives, après quoi ils sont détruits. Vous pouvez utiliser les TempData pour transmettre des messages d'erreur ou quelque chose de similaire.

Bien que dépassée, cet article décrit bien la TempData cycle de vie.

Comme l'a dit Ben Scheirman aquí :

TempData est un dictionnaire de stockage temporaire soutenu par une session et disponible pour une seule demande. Il est idéal pour transmettre des messages entre les contrôleurs.

0 votes

Je pense qu'il s'agit d'une différence assez importante, dans la mesure où TempData implique quelque chose de potentiellement beaucoup plus compliqué (la session) qu'un simple dictionnaire transmis d'une méthode à l'autre

30voto

Diego Deberdt Points 1969

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 pendant la durée d'une seule demande de redirection HTTP.

0 votes

La valeur de ViewData sera-t-elle préservée dans le même cas ?

9 votes

@Ismail : Non, ViewData ne préservera pas les données par le biais de la redirection. C'est la principale différence avec TempData.

5voto

Ali Adravi Points 932

ViewData :

  • 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
  • Sa durée de vie est limitée à la demande en cours.
  • Si l'on transmet une chaîne de caractères, il n'est pas nécessaire d'utiliser le typecast
  • Si l'on transmet un objet, il faut alors le coder, mais avant cela, il faut vérifier qu'il n'est pas nul.
  • Il s'agit d'une propriété sur ControllerBase qui est le parent de Controller classe

TempData :

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

Ce comportement est nouveau depuis ASP.NET MVC 2 et les versions ultérieures. Dans les versions antérieures d'ASP.NET MVC, les valeurs des champs TempData n'étaient disponibles que jusqu'à la demande suivante.

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

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

4voto

testpattern Points 499

J'ai trouvé cette comparaison utile : http://www.dotnet-tricks.com/Tutorial/mvc/9KHW190712-ViewData-vs-ViewBag-vs-TempData-vs-Session.html

Un problème que j'ai rencontré est que les valeurs de TempData sont effacées par défaut après avoir été lues. Il existe des options, voir les méthodes 'Peek' et 'Keep' sur Msdn pour plus d'informations .

0voto

Hitanshi Mehta Points 1

Les données de vue sont utilisées lorsque nous voulons passer des données du contrôleur à la vue correspondante. Les données de vue ont une durée de vie très courte, ce qui signifie qu'elles seront détruites en cas de 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 ponctuels et sa durée de vie est très courte. Nous pouvons utiliser TempData.Keep() pour le rendre disponible dans 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"] = "Ravina12@gmail.com";
        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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X