web-dev-qa-db-fra.com

ViewBag, ViewData et TempData

Quelqu'un pourrait-il expliquer, quand utiliser 

  1. TempData
  2. ViewBag
  3. ViewData

J'ai une exigence, où je dois définir une valeur dans un contrôleur un, ce contrôleur sera redirigé vers le contrôleur deux et le contrôleur deux rendra la vue.

J'ai essayé d'utiliser ViewBag, la valeur est perdue lorsque j'atteins le contrôleur deux.

Puis-je savoir quand utiliser et quels avantages ou inconvénients? 

Merci

200
Hari Gillala

1) TempData 

Vous permet de stocker des données qui survivront pour une redirection. En interne, il utilise la session comme magasin de sauvegarde. Une fois la redirection effectuée, les données sont automatiquement expulsées. Le motif est le suivant:

public ActionResult Foo()
{
    // store something into the tempdata that will be available during a single redirect
    TempData["foo"] = "bar";

    // you should always redirect if you store something into TempData to
    // a controller action that will consume this data
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var foo = TempData["foo"];
    ...
}

2) ViewBag, ViewData

Vous permet de stocker des données dans une action du contrôleur qui sera utilisée dans la vue correspondante. Cela suppose que l'action retourne une vue et ne soit pas redirigée. Ne vit que pendant la demande en cours. 

Le motif est le suivant:

public ActionResult Foo()
{
    ViewBag.Foo = "bar";
    return View();
}

et dans la vue:

@ViewBag.Foo

ou avec ViewData:

public ActionResult Foo()
{
    ViewData["Foo"] = "bar";
    return View();
}

et dans la vue:

@ViewData["Foo"]

ViewBag est juste un wrapper dynamique autour de ViewData et n'existe que dans ASP.NET MVC 3.

Cela étant dit, aucune de ces deux constructions ne devrait jamais être utilisée. Vous devez utiliser des modèles de vue et des vues fortement typées. Donc, le modèle correct est le suivant:

Voir le modèle:

public class MyViewModel
{
    public string Foo { get; set; }
}

Action:

public Action Foo()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

Vue fortement typée:

@model MyViewModel
@Model.Foo

Après cette brève introduction, répondons à votre question:

Mon exigence est que je veux définir une valeur dans un contrôleur, que contrôleur va rediriger vers ControllerTwo et Controller2 restituera la vue.

public class OneController: Controller
{
    public ActionResult Index()
    {
        TempData["foo"] = "bar";
        return RedirectToAction("index", "two");
    }
}

public class TwoController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Foo = TempData["foo"] as string
        };
        return View(model);
    }
}

et la vue correspondante (~/Views/Two/Index.cshtml):

@model MyViewModel
@Html.DisplayFor(x => x.Foo)

L'utilisation de TempData présente également des inconvénients: si l'utilisateur appuie sur F5 sur la page cible, les données seront perdues.

Personnellement, je n'utilise pas non plus TempData. C'est parce qu'en interne, il utilise Session et je désactive la session dans mes applications. Je préfère un moyen plus reposant d'y parvenir. Ce qui est: dans la première action du contrôleur qui effectue la redirection, stockez l'objet dans votre magasin de données et indiquez à l'utilisateur l'identifiant unique généré lors de la redirection. Ensuite, sur l'action cible, utilisez cet identifiant pour récupérer l'objet initialement stocké:

public class OneController: Controller
{
    public ActionResult Index()
    {
        var id = Repository.SaveData("foo");
        return RedirectToAction("index", "two", new { id = id });
    }
}

public class TwoController: Controller
{
    public ActionResult Index(string id)
    {
        var model = new MyViewModel
        {
            Foo = Repository.GetData(id)
        };
        return View(model);
    }
}

La vue reste la même.

283
Darin Dimitrov

ASP.NET MVC nous offre trois options ViewData, ViewBag et TempData pour transmettre des données du contrôleur à la vue et à la demande suivante. ViewData et ViewBag sont presque similaires et TempData assume une responsabilité supplémentaire. Permet de discuter ou d’obtenir des points clés sur ces trois objets:

Similitudes entre ViewBag & ViewData:

  • Permet de conserver les données lorsque vous passez d'un contrôleur à un autre.
  • Utilisé pour transmettre les données du contrôleur à la vue correspondante.
  • Une courte durée de vie signifie que la valeur devient nulle lorsque la redirection se produit. Ceci est Parce que leur objectif est de fournir un moyen de communiquer entre les contrôleurs Et les vues. C’est un mécanisme de communication au sein de l’appel du serveur

Différence entre ViewBag & ViewData:

  • ViewData est un dictionnaire d'objets dérivé de la classe ViewDataDictionary et accessible à l'aide de chaînes comme clés.
  • ViewBag est une propriété dynamique qui tire parti des nouvelles fonctionnalités dynamiques De C # 4.0.
  • ViewData requiert une conversion de type pour un type de données complexe et vérifie les valeurs Null pour éviter les erreurs.
  • ViewBag ne nécessite pas de conversion de type pour les types de données complexes.

ViewBag & ViewData Exemple:

public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}


public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

En vue:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData est également un dictionnaire dérivé de la classe TempDataDictionary et stocké dans une session à durée de vie réduite. Il s'agit d'une clé de chaîne et d'une valeur d'objet. La différence est que le cycle de vie de l'objet. TempData conserve les informations pendant le temps d'une requête HTTP. Cela signifie seulement d'une page à l'autre. Cela fonctionne également avec une redirection 302/303 car elle se trouve dans la même requête HTTP. Permet de conserver les données lorsque vous passez d'un contrôleur à un autre ou d'une action à une autre. En d'autres termes, lorsque vous redirigez, «TempData» aide à conserver les données entre ces redirections. Il utilise en interne des variables de session. L'utilisation des données temporaires pendant la requête en cours et les requêtes suivantes signifie uniquement qu'elle est utilisée lorsque vous êtes sûr que la requête suivante sera redirigée vers la vue suivante. Cela nécessite une conversion de type pour un type de données complexe et une vérification des valeurs NULL pour éviter les erreurs. Généralement utilisé pour ne stocker qu'une fois les messages comme les messages d'erreur, les messages de validation.

public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}

Le dernier mécanisme est la session qui fonctionne comme le ViewData, comme un dictionnaire qui prend une chaîne pour une clé et un objet pour une valeur. Celui-ci est stocké dans le cookie client et peut être utilisé beaucoup plus longtemps. Il faut également plus de vérification pour ne jamais avoir d’informations confidentielles. Concernant ViewData ou ViewBag, vous devez l’utiliser intelligemment pour améliorer les performances des applications. Parce que chaque action parcourt le cycle de vie de la demande asp.net mvc régulière. Vous pouvez utiliser ViewData/ViewBag dans votre action enfant, mais veillez à ne pas l'utiliser pour renseigner les données non liées susceptibles de polluer votre contrôleur.

15
Abdur Rahman

TempData

En gros, c'est comme un DataReader, une fois lues, les données seront perdues.

Voir cette vidéo

Exemple

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        String str = TempData["T"]; //Output - T
        return View();
    }
}

Si vous prêtez attention au code ci-dessus, RedirectToAction n'a aucun impact sur TempData jusqu'à ce que TempData soit lu. Ainsi, une fois TempData lu, les valeurs seront perdues. 

Comment puis-je conserver le TempData après l'avoir lu?

Vérifiez la sortie dans Action Méthode Test 1 et Test 2

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        string Str = Convert.ToString(TempData["T"]);
        TempData.Keep(); // Keep TempData
        return RedirectToAction("Test2");
    }

    public ActionResult Test2()
    {
        string Str = Convert.ToString(TempData["T"]); //OutPut - T
        return View();
    }
}

Si vous prêtez attention au code ci-dessus, les données ne sont pas perdues après RedirectToAction, ni après la lecture des données. Nous utilisons TempData.Keep(). est-ce 

De cette façon, vous pouvez le faire persister aussi longtemps que vous le souhaitez dans d'autres contrôleurs.

ViewBag/ViewData

Les données persisteront dans la vue correspondante

11
user2377970

TempData dans Asp.Net MVC est l’une des fonctionnalités les plus utiles. Il est utilisé pour transmettre les données de la requête en cours à la requête suivante. En d'autres termes, si nous voulons envoyer des données d'une page à une autre pendant la redirection, nous pouvons utiliser TempData, mais nous devons prendre en compte le code pour obtenir cette fonctionnalité dans MVC. Parce que la durée de vie de TempData est très courte et ne dure que jusqu'à ce que la vue cible soit complètement chargée. Mais nous pouvons utiliser la méthode Keep () pour conserver les données dans TempData.

Lire la suite

4
Anil Sharma

ViewBag, ViewData, TempData et View State dans MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ASP.NET MVC nous offre trois options ViewData, VieBag et TempData pour transmettre les données du contrôleur à la vue et à la demande suivante. ViewData et ViewBag sont presque similaires et TempData assume une responsabilité supplémentaire. 

Similitudes entre ViewBag & ViewData:

Permet de conserver les données lorsque vous passez d'un contrôleur à un autre. Habitué transmettre les données du contrôleur à la vue correspondante. La vie courte signifie la valeur devient nulle lorsque la redirection se produit. C'est parce que leur objectif est de fournir un moyen de communiquer entre les contrôleurs et les vues. Ses un mécanisme de communication dans l'appel du serveur.

Différence entre ViewBag & ViewData:

ViewData est un dictionnaire d'objets dérivé de ViewDataDictionary et accessible en utilisant des chaînes comme clés. ViewBag est une propriété dynamique qui tire parti des nouvelles fonctionnalités dynamiques en C # 4.0. ViewData nécessite une conversion de type pour le type de données complexe et vérifier les valeurs NULL pour éviter les erreurs. ViewBag n'a pas besoin de typecasting pour le type de données complexe.

ViewBag & ViewData Exemple:

public ActionResult Index()

{  
    ViewBag.Name = "Arun Prakash";
    return View();    
}

public ActionResult Index()  
{
    ViewData["Name"] = "Arun Prakash";
    return View(); 
}

Dans View, nous appelons comme ci-dessous:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Permet de conserver les données lorsque vous passez d'un contrôleur à un autre contrôleur ou d'une action à l'autre. En d'autres termes, quand vous redirect, "Tempdata" permet de maintenir les données entre ces redirections . Il utilise en interne des variables de session. TempData est censé être un très instance de courte durée, et vous ne devriez l'utiliser que pendant le courant et les demandes suivantes uniquement

Le seul scénario dans lequel l'utilisation de TempData fonctionnera de manière fiable est celui de la redirection. En effet, une redirection supprime la requête en cours (et envoie le code de statut HTTP 302 Object Moved au client), puis crée une nouvelle requête sur le serveur pour servir la vue redirigée.

Cela nécessite une conversion de type pour un type de données complexe et une vérification des valeurs NULL pour éviter les erreurs.

public ActionResult Index()
{   
   var model = new Review()  
   {  
      Body = "Start",  
      Rating=5  
   };  

    TempData["ModelName"] = model;    
    return RedirectToAction("About");   
} 

public ActionResult About()       
{  
    var model= TempData["ModelName"];  
    return View(model);   
}  
3
Arun Prakash
void Keep()

Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep(); // retains all strings values
    } 

void Keep(string key)

Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep("emp"); // retains only "emp" string values
    } 
1
Saineshwar

TempData Sera toujours disponible jusqu'à la première lecture. Une fois que vous l'avez lu, ce n'est plus disponible. Il peut être utile de passer un message rapide, ainsi que d'afficher la vue qui disparaîtra après la première lecture. En transmettant rapidement des données à la vue, vous devez normalement transmettre toutes les données à la vue par le biais du modèle. Toutefois, dans certains cas, vous modélisez en provenance directe d'une classe mappée dans une base de données comme une structure d'entité. quoi changer votre modèle pour passer une nouvelle donnée, vous pouvez le coller dans le viewbag ViewData est juste une version indexée de ViewBag et était utilisé avant MVC3. 

1
David Fawzy

La portée est également différente entre viewbag et temptdata. viewbag est basé sur la première vue (non partagée entre les méthodes d'action) mais temptdata peut être partagé entre une méthode d'action et une autre.

0
Elnaz