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