59

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

但是在controller我希望在视图包中放入一些很难放入我传递给视图的视图模型中的东西。主视图访问 没有问题ViewBag,但在PartialView它不返回任何内容。

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

4

8 回答 8

59

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

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

在索引视图上,我添加了部分视图:

@Html.Partial("ViewName")

在局部视图上,我呈现消息:

@ViewBag.Message

从下面的评论中:当您将模型传递给局部视图时似乎存在问题。然后你可以参考原来的 ViewBag

@ViewContext.Controller.ViewBag.Message
于 2011-04-20T21:54:35.290 回答
34

如果您使用的重载Html.Partial()whereviewData是输入参数之一,例如:

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

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

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

@Html.Partial("PartialViewName", Model)
于 2013-06-17T11:56:30.760 回答
11

TehOne在评论中说:

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

这对我有用。

于 2015-05-01T18:12:21.843 回答
9

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

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

我认为如果您需要传递不同的值ViewDataDictionary(例如,我使用它来更改HtmlFieldPrefix)并且因为在视图中您应该知道将需要什么部分视图,所以应该使用这个答案ViewBag,所以从 ViewBag 中命名所有参数应该不是问题被复制到新ViewBag的部分视图中使用(显然ViewBag使用来自 的值ViewData)。

于 2015-05-22T22:29:02.587 回答
2

>一般情况下,当你使用 Html.Partial 时;

Html.Partial("partialViewName");

为 parentView 发送的 Model,可用于 partialViewName。此外,为 parentView 发送的 ViewData 也可以用于 partialViewName。

>作为一个特例,当你使用 Html.Partial 并且如果你想发送 Model..

Html.Partial("partialViewName", newModel);

您无法访问为 parentView 发送的模型。因此,从现在开始,partialViewName 中处于活动状态的 Model 就是 newModel。为 parentView 发送的 viewData 也可用于 partialViewName。

>作为一种特殊情况,当您使用 Html.Partial 并且如果您想发送 ViewDataDictionary..

为 parentView 发送的模型也可用于 partialViewName

一世。

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

在这里,为 parentView 发送的 ViewData 被“new ViewDataDictionary”覆盖。

在这里,如果有一个用于 parentView 的 ViewBag,如​​果您编写上述代码,您将无法访问它。

二、

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

此用法与第一个(I.)相同。

三、

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)

使用此代码块,您可以在 partialViewName 中访问为 parentView 发送的 ViewData 和 ViewBag

于 2019-04-12T11:37:36.773 回答
1

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

@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 的引用的文本,以获取从控制器传递的一些动态值。事实证明,局部视图的名称很重要。删除部分页面并使用 Add -> View -> MVC 5 View 重新创建它,但将页面命名为 _AppIntro.cshtml 修复了它。

于 2017-10-25T15:28:02.313 回答
0

我的情况是,我对 Model 有部分视图IEnumerable<SampleModel> 但是我必须通过使用,因为 Model.SampleModelList 可以是null

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

简单的解决方案是因为 PartialView 现在也是 View 的一部分 View 上的每个元素都可以被 PartialView 访问,所以我确实将 ViewBag 数据设置为 View html 上的数据元素,而不是 ViewBag。

<div class="showcase-heading" id="dvValue" data-id="@Model.ContentId">@Model.Name</div>
于 2015-08-01T19:30:24.133 回答
0

就我而言@ViewContext.Controller.ViewBag.Message,效果不佳。我有一个局部视图,它从具有不同模型的不同控制器引用,继承自基本模型类。在这种情况下,Controller.ViewBag它为空。

我的解决方案是:

@{
var dummy = ViewContext.Controller.ViewData.TryGetValue("CommonRules", out object rules);
}
...
@Html.Raw(rules)
于 2020-07-31T16:53:17.183 回答