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

时间:2011-04-20 11:53:42

标签: asp.net-mvc-3 viewbag

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

但是在controller我希望在viewbag中添加一些东西很难放在viewmodel中我传递给视图。 主视图访问ViewBag没有问题,但在PartialView中它不会返回任何内容。

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

8 个答案:

答案 0 :(得分:43)

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

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

在索引视图中,我添加了局部视图:

@Html.Partial("ViewName")

在部分视图中,我渲染了消息:

@ViewBag.Message

从下面的评论中:将模型传递给局部视图时似乎存在问题。然后,您可以使用

引用原始ViewBag
@ViewContext.Controller.ViewBag.Message

答案 1 :(得分:31)

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

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

然后您的局部视图将无法查看原始ViewBag中的数据。

删除new ViewDataDictionary(ViewBag),因此您应该写

@Html.Partial("PartialViewName", Model)

答案 2 :(得分:9)

在评论TehOne中说:

  

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

这对我有用。

答案 3 :(得分:7)

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

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

我认为如果您需要传递不同的ViewDataDictionary(例如我将其用于更改HtmlFieldPrefix),并且因为在视图中您应该知道,ViewBag需要更多部分视图,我应该使用此答案。 {1}},因此将ViewBag中的所有参数命名为复制到部分视图中使用的新ViewBag(显然ViewBag使用ViewData中的值)应该不会有问题。< / p>

答案 4 :(得分:2)

  

> 在一般情况下,当您使用Html.Partial;

Html.Partial("partialViewName");

为parentView发送的模型可以在partialViewName中使用。此外,为parentView发送的ViewData也可以用于partialViewName。

  

> 作为一种特殊情况,当您使用Html.Partial以及要发送模型时。

Html.Partial("partialViewName", newModel);

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

  

> 作为一种特殊情况,当您使用Html.Partial以及要发送ViewDataDictionary ..

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

I。

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

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

在这里,如果有一个适用于parentView的ViewBag,那么如果您编写上面的代码,就无法实现。

II。

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

此用法与第一个(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)

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

答案 5 :(得分:0)

我的Senario是,我对模型IEnumerable<SampleModel>有部分看法 但是我必须通过使用,因为Model.SampleModelList可以是null

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

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

在我的情况下,@ViewContext.Controller.ViewBag.Message不能正常工作。 我有一个局部视图,该视图是从具有基本模型类的不同模型的不同控制器引用的。在这种情况下,Controller.ViewBag为空。

我的解决方法是:

@{
var dummy = ViewContext.Controller.ViewData.TryGetValue("CommonRules", out object rules);
}
...
@Html.Raw(rules)