218 votes

ViewBag, ViewData et TempData

Tout organe expliquerait, quand utiliser

  1. TempData
  2. ViewBag
  3. ViewData

J’ai une exigence, où j’ai besoin de définir une valeur dans un contrôleur un, que le contrôleur vous redirigera vers deux contrôleur et deux contrôleur rendra la vue.

J’ai essayé d’utiliser ViewBag, la valeur se perd au moment où que j’arrive à deux contrôleur.

Puis-je savoir quand à l’utilisation et les avantages ou les inconvénients ?

Merci

308voto

Darin Dimitrov Points 528142

1)TempData

Permet de stocker des données qui permettront de survivre à une redirection. En interne, il utilise la Session, comme le bicarbonate de magasin, c'est juste qu'après la redirection est faite, les données sont automatiquement supprimé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

Permet de stocker des données dans un contrôleur qui sera utilisé dans la vue correspondante. Cela suppose que l'action revient à un point de vue et n'a pas de redirection. Ne vit que lors de la demande actuelle.

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 une dynamique wrapper autour de ViewData et n'existe que dans ASP.NET MVC 3.

Ceci étant dit, aucun de ces deux constructions ne doit jamais être utilisé. Vous devriez utiliser des modèles de vue et des points de vue fortement typée. Ainsi, le modèle correct est le suivant:

Modèle de vue:

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

Action:

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

Fortement typé vue:

@model MyViewModel
@Model.Foo

Après cette brève introduction nous allons répondre à votre question:

Mon exigence est que je veux mettre une valeur dans un contrôleur, qui contrôleur de rediriger vers ControllerTwo et Controller2 rendra le point de 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)

Il y a des inconvénients de l'utilisation de TempData ainsi: si l'utilisateur appuie sur la touche F5 sur la page cible, les données seront perdues.

Personnellement je n'utilise pas TempData ni. C'est parce qu'en interne, il utilise la Session et j'ai désactiver la session dans mes applications. Je préfère un plus Reposant pour y parvenir. Qui est: dans la première action du contrôleur qui effectue la redirection stocker l'objet dans votre magasin de données et l'utilisateur unique généré id lors de la redirection. Puis sur la cible à utiliser cet identifiant pour aller chercher de retour à l'origine stocké l'objet:

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

Le point de vue reste le même.

15voto

Abdur Rahman Points 2630

ASP.NET MVC nous offre trois options ViewData, ViewBag, et TempData de la transmission des données de contrôleur d'affichage et dans la prochaine demande. ViewData et ViewBag sont presque similaires et TempData effectue une responsabilité supplémentaire. Permet de discuter ou d'obtenir des points clés sur ces trois objets:

Les similitudes entre le ViewBag & ViewData :

  • Aide à conserver les données lorsque vous déplacez d'un contrôleur de vue.
  • Utilisé pour transmettre des données de contrôleur à la vue correspondante.
  • De vie court, moyen valeur devient nulle lorsque la redirection se produit. C'est parce que leur but 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' d'appel de serveur.

Différence entre ViewBag & ViewData:

  • ViewData est un dictionnaire d'objets qui est dérivée à partir de ViewDataDictionary classe et accessibles à l'aide de chaînes de caractères comme des clés.
  • ViewBag est une propriété dynamique qui tire parti de la nouvelle dynamique fonctionnalités de C# 4.0.
  • ViewData nécessite typecasting de type de données complexe et vérifier les valeurs null pour éviter l'erreur.
  • ViewBag ne nécessite pas de typecasting de type de données complexe.

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 TempDataDictionary classe et stockées dans une vie courte session et c'est une chaîne de la clé et de la valeur de l'objet. La différence est que le cycle de vie de l'objet. TempData garder l'information pour le moment d'une Requête HTTP. Cela signifie seulement d'une page à l'autre. Ce aussi travailler avec un 302/303 redirection parce que c'est dans la même Requête HTTP. Aide à conserver les données lorsque vous vous déplacez d'un contrôleur à l'autre contrôleur ou d'une action à une autre action. En d'autres termes lorsque vous rediriger, "TempData" contribue à maintenir les données entre ces redirections. Il utilise en interne des variables de session. Temp d'utilisation des données au cours de l'actuelle et de la demande ultérieure, seul moyen c'est de les utiliser lorsque vous êtes sûr que la prochaine demande sera rediriger à la vue suivante. Il nécessite typecasting de type de données complexe et vérifier les valeurs null pour éviter l'erreur. Généralement utilisé pour stocker une seule 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");
}
<pre><pre lang="cs">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 de clés et d'objets de valeur. Celui-ci est stocké dans le Cookie client et peuvent être utilisés pour un temps beaucoup plus long. Il a également besoin de plus de vérification pour n'avoir aucune information confidentielle. Concernant ViewData ou ViewBag vous devriez l'utiliser intelligemment pour les performances de l'application. Parce que chaque action se passe à travers l'ensemble du cycle de vie de l'ordinaire asp.net mvc demande. Vous pouvez utiliser ViewData/ViewBag de votre enfant à l'action, mais être prudent que vous ne l'utilisez pas pour remplir les données non liées qui peuvent polluer votre contrôleur.

12voto

Pankaj Garg Points 274

TempData

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

Regardez 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 payez l'attention sur le code ci-dessus, RedirectToAction n'a pas d'impact sur la TempData jusqu'à TempData est lu. Donc, une fois de TempData est lu, les valeurs seront perdues.

Comment puis-je garder le TempData après la lecture?

Vérifiez la sortie de l'Action Méthode de Test 1 et le 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 payez l'attention sur le code ci-dessus, les données ne sont pas perdues après RedirectToAction ainsi que, après la Lecture des Données et la raison en est, Nous utilisons TempData.Keep(). c'est que

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 persistent à la Vue correspondante

3voto

Arun Prakash Points 144

ViewBag, ViewData, TempData et l'État d'Affichage en MVC

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

ASP.NET MVC nous offre trois options ViewData, VieBag et TempData de la transmission des données de contrôleur d'affichage et dans la prochaine demande. ViewData et ViewBag sont presque similaires et TempData effectue une responsabilité supplémentaire.

Les similitudes entre le ViewBag & ViewData :

Aide à conserver les données lorsque vous déplacez d'un contrôleur de vue. Utilisé pour transmettre des données de contrôleur à la vue correspondante. Court de la vie la valeur devient nulle lorsque la redirection se produit. C'est parce que leur but est de fournir un moyen de communiquer entre les contrôleurs et les vues. C'est un mécanisme de communication au sein du serveur d'appel.

Différence entre ViewBag & ViewData:

ViewData est un dictionnaire d'objets qui est dérivée à partir de ViewDataDictionary classe et accessibles à l'aide de chaînes de caractères comme des clés. ViewBag est une propriété dynamique qui tire parti de la nouvelle dynamique caractéristiques en C# 4.0. ViewData nécessite typecasting de type de données complexe et vérifier les valeurs null pour éviter l'erreur. ViewBag ne nécessite pas de typecasting de 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(); 
}

En Vue, nous appelons, comme ci-dessous:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Aide à conserver les données lorsque vous vous déplacez d'un contrôleur à l'autre contrôleur ou d'une action à une autre action. En d'autres termes lorsque vous rediriger, "Tempdata" contribue à maintenir les données entre ces redirections. Il utilise en interne des variables de session. TempData est censé être une très de courte durée de l'instance, et vous ne devriez l'utiliser au cours de l' et la suite des demandes seulement

Le seul scénario où à l'aide de TempData sera fiable de travail, c'est quand vous rediriger. C'est parce que une redirection tue à la demande actuelle (et envoie le code d'état HTTP 302 Objet s'est Déplacé vers le client), puis crée une nouvelle demande sur le serveur pour servir la redirection de vue.

Il nécessite typecasting de type de données complexe et vérifier les valeurs null pour éviter l'erreur.

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

1voto

Saineshwar Points 26
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
    } 

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