57 votes

Impossible d'accéder à ViewBag dans une vue partielle en ASP.NET MVC3

J'ai un contrôleur qui appelle une vue. Dans la vue, il y a un PartialView appelé être @Html.Partial("ViewName", model). Cela fonctionne bien.

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

Est-il possible d'utiliser le ViewBag dans ce cas ou dois-je "pirater" ces données dans le modèle que je passe à la vue (et le modèle que je passe à la fonction PartialView et le modèle que je passe à la PartialView imbriqué dans le premier PartialView ) ?

0 votes

Une chose à retenir au sujet de la dynamique est qu'elle est sensible à la casse.

0 votes

Mon erreur, j'ai utilisé @Html.Action dans la chaîne sans m'en souvenir.

7 votes

C'est vraiment idiot que j'aie obtenu un badge d'or pour cette question très médiocre. J'ai un peu honte.

57voto

slfan Points 4541

Cela devrait fonctionner sans problème. Dans mon action HomeController Index, 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

D'après les commentaires ci-dessous : il semble y avoir un problème lorsque vous passez un modèle à la vue partielle. Vous pouvez alors faire référence au ViewBag original avec

@ViewContext.Controller.ViewBag.Message

28 votes

J'ai constaté que si vous utilisez @Html.Partial("ViewName", Model), le reste du sac d'affichage ne sera pas disponible.

2 votes

Vous êtes sûr ? Pour moi, c'est seulement le cas lorsque vous spécifiez explicitement le viewData. Comme ceci : @Html.Partial("ViewName", Model, ViewData) sinon le ViewBag est entièrement accessible.

24 votes

Je sais que c'est un peu vieux, mais pour référence future, j'ai résolu ce problème en utilisant ViewContext.Controller.ViewBag.Property . Bien sûr, cela signifie que le ViewBag La propriété à laquelle vous essayez d'accéder a été définie dans le contrôleur, mais je pense que c'est un cas assez commun.

33voto

Anjmao Points 101

Si vous utilisez une surcharge de la fonction Html.Partial() donde 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.

Retirer new ViewDataDictionary(ViewBag) Vous devez donc écrire

@Html.Partial("PartialViewName", Model)

1 votes

Veuillez noter que j'ai déjà trouvé la cause de l'erreur, il est donc peut-être un peu difficile pour cette réponse d'être pertinente.

11 votes

@SoonDead mais cette réponse reste pertinente pour les googlers qui viennent ici :)

0 votes

@EvgenyLevin C'est vrai.

11voto

jmoreno Points 6995

Dans un commentaire TehOne a dit :

Je sais que c'est un peu vieux, mais pour référence future, j'ai résolu le problème en utilisant les méthodes suivantes utilisant ViewContext.Controller.ViewBag.Property. Bien sûr, cela signifie que la propriété ViewBag à laquelle vous essayez d'accéder a été définie dans le contrôleur. contrôleur, mais je pense que c'est un cas assez courant.

C'est ce qui a marché pour moi.

9voto

Zoka Points 1431

Récemment, j'ai rencontré le même problème, mais les réponses données ici n'étaient que des solutions de contournement car elles proposaient de ne pas utiliser la surcharge de l'option Html.Partial en utilisant viewData . Mais si vous deviez utiliser ces surcharges, je crois que la réponse correcte 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érents ViewDataDictionary (par exemple, je l'utilise pour changer HtmlFieldPrefix ) et parce que dans la vue, vous devez savoir de quelle vue partielle vous aurez besoin en ViewBag Ainsi, il ne devrait pas y avoir de problème pour nommer tous les paramètres de ViewBag à copier dans le nouveau fichier de configuration. ViewBag utilisé en vue partielle (apparemment ViewBag utilise les valeurs de ViewData ).

2voto

> Dans un scénario général, lorsque vous utilisez Html.Partial ;

Html.Partial("partialViewName");

Le modèle qui est envoyé pour le parentView, peut être utilisé pour dans le partialViewName. De plus, la ViewData qui est envoyée pour le parentView peut également être utilisée pour le partialViewName.

> Comme un cas particulier, lorsque vous utilisez Html.Partial et si vous voulez envoyer Model

Html.Partial("partialViewName", newModel);

Vous ne pouvez pas atteindre le modèle qui a été envoyé pour la vue parent. Par conséquent, à partir de maintenant, le modèle qui est actif dans la partialViewName est le newModel. La viewData qui est envoyée pour parentView peut être utilisée aussi pour partialViewName.

> Comme un cas spécial, lorsque vous utilisez Html.Partial et si vous voulez envoyer ViewDataDictionary .

Le modèle qui est envoyé pour le parentView peut être utilisé également pour le partialViewName.

I.

@Html.Partial("partialViewName", new ViewDataDictionary { { "key", value }, { "key2", value2 }  })

Ici, les ViewData qui ont été envoyées pour le parentView sont écrasées par 'new ViewDataDictionary'.

Ici, s'il y a un ViewBag qui est pour parentView, vous ne pouvez pas l'atteindre si vous écrivez le code comme celui ci-dessus.

II.

ViewDataDictionary viewDataDictionary =  new ViewDataDictionary();
viewDataDictionary.Add("key", value);
viewDataDictionary.Add("key2", value2);
@Html.Partial("partialViewName", viewDataDictionary)

Cet usage est le même que le premier (I.).

III.

ViewDataDictionary viewDataDictionary = ViewData; //If you use this code block,  ViewBag which is sent for parent View is not lost.
viewDataDictionary.Add("key", value);
viewDataDictionary.Add("key2", value2);
@Html.Partial("partialViewName", viewDataDictionary)

Avec ce bloc de code, vous pouvez atteindre les ViewData et ViewBag qui sont envoyés pour le parentView dans le partialViewName.

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