无法在ASP.NET MVC3的部分视图中访问ViewBag

我有一个控制器调用一个视图。 在视图中有一个名为be @Html.Partial("ViewName", model).PartialView @Html.Partial("ViewName", model). 这工作正常。

但是在controller我希望在视图中放入一些东西,这样我就很难把视angular放到视图中去。 主视图访问ViewBag没有问题,但在PartialView中不返回任何东西。

在这种情况下是否可以使用ViewBag ,或者我应该将这些数据“转入”我传递给视图的模型(并将模型传递给PartialView ,并将模型传递给嵌套在PartialView中的PartialView ) ?

这应该没有任何问题。 在我的HomeController索引操作中,我向ViewBag添加一条消息:

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

在索引视图上添加部分视图:

 @Html.Partial("ViewName") 

在部分视图上,我呈现了这个消息:

 @ViewBag.Message 

完美的作品。 你还干了什么? 可能是打字错误?

如果使用Html.Partial()的重载,其中viewData是input参数之一,例如:

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

那么你的局部视图将不会看到你的原始ViewBag中的数据。

删除new ViewDataDictionary(ViewBag) ,所以你应该写

 @Html.Partial("PartialViewName", Model) 

TehOne在评论中说:

我知道这是有点旧,但为了将来的参考,我解决了这个通过使用ViewContext.Controller.ViewBag.Property。 当然,这意味着您试图访问的ViewBag属性是在控制器中设置的,但我认为这是一个常见的情况。

这是为我工作。

最近我遇到了同样的问题,但是这里的答案只是解决方法,因为他们build议不要使用viewData重载viewData 。 但是如果你不得不使用这些重载,我相信正确的答案是:

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

我认为这个答案应该用来传递不同的ViewDataDictionary (例如我们用它来改变HtmlFieldPrefix ),因为在视图中你应该知道在ViewBag需要什么局部视图,所以它不应该成为问题, ViewBag中的参数被复制到局部视图中使用的新ViewBag (显然, ViewBag使用ViewData值)。

我的senario是,我用Model IEnumerable<SampleModel>部分视图然而,我不得不通过使用,因为Model.SampleModelList可以为null

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

简单的解决scheme是因为PartialView现在也是View的一部分View上的每个元素都可以通过PartialView访问,所以我没有将ViewBag数据设置为View html上的数据元素,而不是ViewBag。

 <div class="showcase-heading" id="dvValue" data-id="@Model.ContentId">@Model.Name</div> 

我在一个非常基本的页面上遇到了同样的问题:

 @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> 

部分视图仅包含带有对ViewBag的一些引用的文本,以获取从控制器传递的一些dynamic值。 原来,部分视图的名称是重要的。 删除部分页面并使用添加 – >查看 – > MVC 5视图重新创build它,但命名该页面_AppIntro.cshtml修复它。