可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a controller calling a view. In the view there is a PartialView
called be @Html.Partial("ViewName", model).
This works fine.
But in the controller
I wish to put something in the viewbag what would be hard to put in the viewmodel I pass to the view.
The main view have no problem accessing the ViewBag
, but in the PartialView
it does not return anything.
Is it possible to use the ViewBag
in this case or should I "hack" this data into the model I pass to the view (and the model I pass to the PartialView
, and the model I pass to the PartialView
nested in the first PartialView
)?
回答1:
That should work without any problems. In my HomeController Index action I add a message to the ViewBag:
ViewBag.Message = "Welcome to ASP.NET MVC!";
On the Index View I add the partial view:
@Html.Partial("ViewName")
And on the partial view I render the message:
@ViewBag.Message
From the comments below: there seems to be a problem when you pass a model to the partial view. Then you can refer to the original ViewBag with
@ViewContext.Controller.ViewBag.Message
回答2:
If you are using an overload of the Html.Partial()
where viewData
is one of the input parameters, for example:
@Html.Partial("PartialViewName", Model, new ViewDataDictionary(ViewBag))
then your partial view will not see data from your original ViewBag.
Remove new ViewDataDictionary(ViewBag)
, so you should write
@Html.Partial("PartialViewName", Model)
回答3:
In a comment TehOne said:
I know this is a bit old, but for future reference, I solved this by
using ViewContext.Controller.ViewBag.Property. Of course this means
that the ViewBag property you are trying to access was set in the
controller, but I think that is a common enough case.
Which is what worked for me.
回答4:
Recently I was experiencing same problem, but the answers here were just workarounds as they propose not to use the overload of Html.Partial
using viewData
. But if you had to use these overloads I believe the correct answer is:
@Html.Partial(
"PartialViewName",
model_object,
new ViewDataDictionary() { { "Value1InViewBag", ViewBag.Value1InViewBag }, { "Value2InViewBag", ViewBag.Value2InViewBag } }
)
I think this answer should be used if you need to pass different ViewDataDictionary
(e.g. I us it for changing HtmlFieldPrefix
) and because in the view you should know, what partial view wil need in ViewBag
, so it should not be problem to name all the parameters from ViewBag to be copied into new ViewBag
used in partial view (apparently ViewBag
uses values from ViewData
).
回答5:
My senario was, I had partial view with Model IEnumerable<SampleModel>
However I had to pass using, coz Model.SampleModelList can be null
@Html.Partial("PartialViewName", Model.SampleModelList, new ViewDataDictionary())
The simple solution was since PartialView is also now part of View every element on View can be accessed by PartialView so I did set the ViewBag data to data-element on View html, instead of ViewBag.
<div class="showcase-heading" id="dvValue" data-id="@Model.ContentId">@Model.Name</div>
回答6:
I was having this same problem with a very basic page:
@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>
And the partial view contained only text with some references to ViewBag to fetch some dynamic values passed from the controller. It turned out that the name of the partial view mattered. Removing the partial page and recreating it with Add -> View -> MVC 5 View but naming the page _AppIntro.cshtml fixed it.