Ne peut pas accéder à ViewBag dans une vue partielle en ASP.NET MVC3

j'ai un contrôleur appelant une vue. Dans la vue il y a un PartialView appelé be @Html.Partial("ViewName", model). cela fonctionne très bien.

mais dans le controller je souhaite mettre quelque chose dans le viewbag ce qui serait difficile à mettre dans le viewmodel je passe à la vue. La vue principale n'a aucun problème pour accéder au ViewBag , mais dans le PartialView elle ne renvoie rien.

Est-il possible d'utiliser le ViewBag dans ce cas, ou devrais-je "bidouille" cette donnée dans le modèle je passe à la vue(et le modèle je passe au PartialView , et le modèle je passe au PartialView emboîté dans le premier PartialView )?

50
demandé sur Tushar 2011-04-20 15:53:41

6 réponses

Qui devrait fonctionner sans problèmes. Dans mon action Index HomeController J'ajoute un message au ViewBag:

ViewBag.Message = "Welcome to ASP.NET MVC!";

sur la vue Index j'ajoute la vue partielle:

@Html.Partial("ViewName")

et sur la vue partielle je rends le message:

@ViewBag.Message

Dans les commentaires ci-dessous: il semble y avoir un problème lorsque vous passez un modèle à la vue partielle. Alors vous pouvez vous référer à L'original ViewBag avec

@ViewContext.Controller.ViewBag.Message
43
répondu slfan 2018-03-16 13:42:06

Si vous utilisez une surcharge de la Html.Partial()viewData est l'un des paramètres d'entrée, par exemple:

@Html.Partial("PartialViewName", Model, new ViewDataDictionary(ViewBag))

alors votre vue partielle ne verra pas les données de votre ViewBag original.

Supprimer new ViewDataDictionary(ViewBag) , donc vous devez écrire

@Html.Partial("PartialViewName", Model)
30
répondu Andzej Maciusovic 2014-03-20 13:32:53

Dans un commentaire TehOne , a déclaré:

je sais que c'est un peu vieux, mais pour référence future, j'ai résolu ceci par utiliser ViewContext.Contrôleur.ViewBag.Propriété. Bien sûr, cela signifie que la propriété ViewBag à laquelle vous essayez d'accéder a été contrôleur, mais je pense que c'est un cas assez courant.

ce qui a fonctionné pour moi.

9
répondu jmoreno 2017-05-23 12:25:46

récemment, je rencontrais le même problème, mais les réponses ici étaient juste des solutions de travail car ils proposent de ne pas utiliser la surcharge de Html.Partial en utilisant viewData . Mais si vous deviez utiliser ces surcharges je crois que la bonne réponse est:

@Html.Partial(
     "PartialViewName",
     model_object,
     new ViewDataDictionary() { { "Value1InViewBag", ViewBag.Value1InViewBag }, { "Value2InViewBag", ViewBag.Value2InViewBag } }
)

je pense que cette réponse devrait être utilisée si vous avez besoin de passer différent ViewDataDictionary (par exemple, je l'utilise pour changer HtmlFieldPrefix ) et parce que dans la vue vous devriez savoir, quelle vue partielle sera nécessaire dans ViewBag , il ne devrait donc pas être difficile de nommer tous les paramètres de ViewBag à copier dans le nouveau ViewBag utilisé en vue partielle (apparemment ViewBag utilise des valeurs de ViewData ).

7
répondu Zoka 2015-05-22 22:29:02

mon senario était, j'ai eu la vue partielle avec le modèle IEnumerable<SampleModel> Cependant j'ai dû passer en utilisant, le modèle coz.SampleModelList peut être null

@Html.Partial("PartialViewName", Model.SampleModelList, new ViewDataDictionary())

la solution simple était que puisque PartialView fait aussi maintenant partie de View chaque élément sur View peut être accédé par PartialView ainsi j'ai placé les données de ViewBag à l'élément de données sur View html, au lieu de ViewBag.

<div class="showcase-heading" id="dvValue" data-id="@Model.ContentId">@Model.Name</div>
0
répondu brykneval 2015-08-01 19:30:24

j'avais ce même problème avec une page très basique:

@Html.Partial("_AppIntro")

<div class="form-group row">
    <div class="col-md-10">
        <a href="/Ag/Application/1" class="btn btn-default btn-primary">Next</a>
    </div>
</div>

et la vue partielle ne contenait que du texte avec quelques références à ViewBag pour récupérer certaines valeurs dynamiques transmises par le contrôleur. Il s'est avéré que le nom de la vue partielle importait. Supprimer la page partielle et la recréer avec Add -> View -> MVC 5 View mais nommer la page _AppIntro.cshtml fixe.

0
répondu John Sully 2017-10-25 15:28:02