web-dev-qa-db-fra.com

Cycle de vie ViewBag / ViewData

J'ai vu de nombreux messages sur le moment d'utiliser ViewBag/ViewData vs ViewModel mais je n'ai pas pu trouver d'explication sur le cycle de vie du ViewBag.

Par exemple, j'ai deux méthodes d'action dans un contrôleur:

// POST: /MyModel/Edit/5
[HttpPost]
public ActionResult Edit(MyModel _mymodel){}

et

// GET: /MyModel/Edit/5
public ActionResult Edit(int id){}

Si je mets des valeurs dans le ViewBag dans la méthode d'action GET, pour configurer des étiquettes de formulaire, puis quand l'utilisateur clique sur le bouton "Soumettre" et que le formulaire est posté sur le serveur via HTTP POST, les valeurs de ViewBag ne sont plus dans la méthode d'action POST.

Quelqu'un peut-il expliquer (ou fournir une référence à un bon article) le cycle de vie du ViewBag/ViewData?

37
JTech

Les données que vous mettez dans ViewBag/ViewData ne sont disponibles que pendant le cycle de vie de la demande dans laquelle vous l'avez remplie. MVC n'a pas de dos de message. Si vous avez besoin que quelque chose persiste sur plusieurs requêtes, vous devez utiliser Session.

Voici un article décent sur les différences entre ViewData, ViewBag et TempData: http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc- 3 applications

39
Zach Green

La réponse acceptée ici ne décrit pas vraiment le cycle de vie de ViewBag/ViewData. Il est regrettable qu'il ne semble pas y avoir de documentation claire à ce sujet. Cependant, sur cette base:

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

Il semblerait que le cycle de vie soit:

Demande IIS -> Routage -> MVC Handler -> Controller (with ViewData) -> View (with ViewData) -> Disposal

Ainsi, le ViewData (que ViewBag enveloppe simplement) serait en fait instancié avec le ControllerContext, en même temps que TempData est instancié. Cela se produit quelques étapes après l'étape 4: le gestionnaire MVC s'exécute.

Il y a une étape intéressante plus tard où "Si la page a ViewData, le ViewData est défini" pendant le transfert du contrôleur à la vue. ViewData est clairement disponible avant cela, donc définir ne signifie pas instancier. Cela semble plutôt signifier qu'il est transféré du contrôleur (qui, rappelez-vous, n'est pas disponible pour une vue) au ViewContext (le conteneur qui fournit l'accès à ViewBag/ViewData et au modèle).

Le ViewData est vraisemblablement éliminé en même temps que le reste de la View.

Il est important de noter également que les vues MVC sont rendues de l'intérieur vers l'extérieur, de sorte que la vue particulière et toutes les affectations qu'elle fait au ViewBag se produiront également dans l'ordre intérieur à extérieur. Cela signifie que quelque chose défini sur une page enfant View sera disponible pour une mise en page, mais l'ajout de quelque chose à un ViewBag dans une mise en page, puis sa lecture dans une page enfant View échouera.

9
Chris Moschini

De MSDN - ViewBag: le dictionnaire de données de vue dynamique, ViewData: le dictionnaire des données de vue.

Donc, ceci/ceci est un dictionnaire pour une vue donnée. Vous définissez ses valeurs dans votre action et vous l'utilisez dans votre vue. Comme l'a dit Zach, il ne reviendra pas avec la demande suivante. Vous pouvez renvoyer ses valeurs à n'importe quelle action donnée sous forme de champ de formulaire, dans la chaîne de requête, etc., mais ces valeurs ne seront pas automatiquement disponibles en tant que propriétés de VieBag.

2
veblock

ViewBag et ViewData sont utilisés dans le même but. Ils sont utilisés pour transmettre des données des contrôleurs à la vue. Lorsque nous leur attribuons des données ou des objets, ils sont accessibles dans la vue.

  • ViewData: ViewData est un dictionnaire d'objets et ils sont accessibles par chaîne comme clé.
  • ViewBag: Utilise la fonction dynamique. Il permet à un objet de lui ajouter des propriétés dynamiques.
0
sudhakar