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é (pas static).
  • 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ès return View(); est exécutée. Donc ViewBag est hors de portée une fois l'ensemble de la demande est terminée. C'est pourquoi la ViewBag 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 un ExpandoObject.
  • 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 œuvre IEnumerable, 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érite ControllerBase qui a le public 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.

InformationsquelleAutor hattenn | 2013-06-05