Comment ViewBag dans ASP.NET MVC de derrière les coulisses?
Je suis la lecture d'un livre sur ASP.NET MVC et je me demande comment l'exemple suivant fonctionne:
Exemple #1
Contrôleur
public class MyController : Controller
{
public ActionResult Index()
{
ViewBag.MyProperty = 5;
return View();
}
}
Vue
<h1>@ViewBag.MyProperty</h1>
Maintenant, je comprends que ViewBag
est un objet dynamique, donc, c'est comment vous pouvez définir la propriété (bien que je ne sais pas beaucoup sur la dynamique des objets, n'a jamais travaillé avec eux.) Mais comment la vue d'obtenir l'instance spécifique de l' ViewBag
de la manette, même si l'on ne passe pas directement?
Je pensais que le ViewBag
pourrait être un public
static
objet, mais ensuite tout changement serait mondial et il ne serait pas spécifiques à une instance de vue.
Pourriez-vous expliquer comment cela fonctionne en arrière-plan?
Exemple #2
Contrôleur
public class MyController : Controller
{
public ActionResult Index()
{
ViewBag.MyProperty = 5;
return View();
}
public ActionResult Index2()
{
ViewBag.MyProperty = 6;
return View();
}
}
Maintenant, disons le Index
méthode est appelée en premier, puis le Index2
. En fin de compte la valeur de ViewBag.MyProperty
finira 6 (la valeur de Index2
). J'ai l'impression que ce n'est pas une bonne chose à faire, mais en même temps j'ai l'impression que je suis en train de penser dans le bureau termes de développement. Peut-être qu'il n'a pas d'importance lorsqu'il est utilisé avec ASP.NET MVC, à mesure que le web est apatride. Est-ce le cas?
- J'imagine que le
ViewBag
objet est simplement instancié avec le contrôleur de l'objet comme une instance de la propriété (passtatic
). - Vous pouvez voir que c'est en fait un membre de la controller: msdn.microsoft.com/en-us/library/...
- Donc si il y a deux méthodes retournant différentes vues de la même propriété sur le
ViewBag
exemple, il peut influencer les uns les autres? Ne serait-ce pas causer un problème? Je sens que je suis encore en réflexion dans le bureau de développement de si. - Le contrôleur est appelé lorsque
Index()
est appelé, et éliminés aprèsreturn View();
est exécutée. DoncViewBag
est hors de portée une fois l'ensemble de la demande est terminée. C'est pourquoi laViewBag
propriétés ne sont pas conservées entre les demandes. - bien puis. Il fait sens aujourd'hui. Je ne savais pas ce qui a été appelé lorsque. Comme je l'ai dit, pensant encore de bureau chemin du développement. Pourriez-vous écrire ces comme une réponse, je vais choisir ce que l'on a accepté la réponse.
- Je voudrais bien, mais on ne sait pas à partir de la page MSDN que @dbaseman lié ce qui est réellement stocké dans
object
de la propriété. Je soupçonne que c'est unExpandoObject
. - WebForms est un framework web qui est près du bureau de développement. MVC, cependant, est de façon bien différente. C'est beaucoup plus le modèle web. Donc, en essayant de comprendre MVC outils (tels que le ViewBag) en faisant un parallèle avec le bureau sera toujours vous entraîner à confusion conclusions (ou des questions).
- Je me souviens avoir lu que c'était un
ExpandObject
quelques minutes plus tôt, quelque part, laissez-moi voir. - Wow,
ExpandoObject
est cool. Il met en œuvreIEnumerable
, et donc toutes les méthodes Linq travail sur elle. - dans cette réponse, stackoverflow.com/a/14985891/494094; Aniket dit que c'est un
ExpandObject
, mais malheureusement, il n'a pas de citer ses ressources. @AndreCalil, vous avez raison, c'est complètement différent que le développement de postes de travail. Je suis juste essayer d'envelopper mon esprit autour de lui et de changer mon état d'esprit. - Vous pouvez parcourir la définition de classes de VS:
Controller
hériteControllerBase
qui a lepublic dynamic ViewBag { get; }
propriété - Je crois que cette question mérite un wiki réponse =)
- Il y a tellement de choses qui fonctionne comme par magie derrière les coulisses de ASP.NET MVC cependant, il n'est pas juste d'essayer de comprendre la façon de web fonctionne. Autant de conventions et de la magie des choses. Il ressemble beaucoup, mais rien de ce que je suis habitué.
- J'ai eu ce sentiment quand j'ai commencé sur ASP.NET MVC trop, et je déteste ça. Si je me pose la question "comment cela fonctionne?" et je ne peux pas donner une réponse raisonnable, je vais la chercher. Gardez à l'aide de MVC et vous remarquerez qu'il n'y a pas de magie, c'est que toutes les conventions (qui vous avez à découvrir, parfois).
- ouais, bien sûr, mais cela ressemble à de la magie jusqu'à ce que vous de lire et de comprendre comment il est mis en place 🙂 C'est plutôt cool même si, je l'aime. C'est juste un peu fatigant, comme je ne cesse de demander "Attendez une minute, comment l'enfer serait-ce que le travail?" tout le temps.
- Lors de l'apprentissage de ASP.NET MVC, nerddinner.codeplex.com m'a beaucoup aidé. Check it out!
- merci pour le lien. J'en ai entendu parler avant, et il est certainement le vérifier.
Vous devez vous connecter pour publier un commentaire.
ViewBag
est une propriété deControllerBase
, qui tous les contrôleurs doivent hériter de la. C'est undynamic
objet, c'est pourquoi vous pouvez ajouter de nouvelles propriétés sans se faire de la compilation des erreurs.Ce n'est pas
static
, c'est un membre de l'objet. Lors de la demande de durée de vie, le contrôleur instance est créée et éliminés, de sorte que vous n'aurez pas de "simultanéité" des problèmes, comme l'écrasement de la valeur.La
View
(et ses variantes) méthode n'est passtatic
ainsi, et c'est comment la vue reçoit leViewBag
valeurs: pendant le processus de rendu de la vue, l'instance du contrôleur a son ViewBag instance.ViewBag
est une propriété deWebViewPage
ainsi. comment est-il obtenir des données qui est attribué àControllerBase.ViewBag
de la propriété. Pouvez-vous développer s'il vous plaît ?ActionResult
est en cours de création. Si nous prenons ASP.NET Core, MVC, comme un exemple, vous pouvez voir queViewContext
le reçoit sur le ctor: github.com/aspnet/Mvc/blob/dev/src/...Si vous souhaitez analyser ControllerBase classe, vous verriez que ViewBag propriété est un "proxy" pour ViewData bien juste pour faire de votre source de l'esthétique. (Je me souviens même de Scott, Hanselman prenant interview de Phil Haack où Phil introduit ViewBag propriété comme un raccourci pour ViewData et en éliminant la nécessité de répéter les crochets et les citations). Même si
ViewBag
propriété est exposée commedynamic
objet qu'il met en œuvre un DynamicViewDataDictionary classe qui travaille directement avec ViewData.En regardant le code source de Contrôleur catégorie, vous pouvez trouver cette méthode:
Donc, fondamentalement, lorsque vous appelez
return View();
à partir de votre contrôleur, il crée une nouvelle instance deActionResult
classe en passant ViewData de contrôleur pour son constructeur. Exemple deActionResult
est ensuite transmise à un moteur d'affichage (ASPX, Rasoir) de sorte qu'il pourrait être utilisé pour afficher une vue en question.Faire ViewBag/ViewData public static pourrait être nocif. Chaque requête web de votre application MVC crée une nouvelle instance du contrôleur. Si vous avez de l'ViewData/ViewBag comme public static puis deux utilisateurs simultanés permettrait de partager les mêmes données à partir d'ViewBag/ViewData.
Ici est une vidéo. Discussion sur ViewBag (formder ViewModel) commence à 04:05,
ViewBag
est une propriété deControllerBase
. Elle est définie comme suit:Noter que cette signature est incorrecte. Voici ce que le code source ressemble réellement:
_dynamicViewDataDictionary
est un ExpandoObject; vous pouvez ajouter des propriétés au moment de l'exécution. Sa durée de vie est la même que celle du contrôleur, qui est la durée de vie de la requête HTTP.public dynamic ViewBag { get; }