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

问题描述 投票:49回答:7

我有一个控制器调用视图。在视图中有一个PartialView称为@Html.Partial("ViewName", model).这很好。

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

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

asp.net-mvc-3 viewbag
7个回答
45
投票

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

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

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

@Html.Partial("ViewName")

在部分视图中,我呈现消息:

@ViewBag.Message

从下面的注释:将模型传递给局部视图时似乎存在问题。然后你可以参考原始的ViewBag

@ViewContext.Controller.ViewBag.Message

31
投票

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

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

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

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

@Html.Partial("PartialViewName", Model)

10
投票

在评论中TehOne说:

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

哪个对我有用。


8
投票

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

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

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


2
投票

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

Html.Partial("partialViewName");

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

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

Html.Partial("partialViewName", newModel);

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

>作为特例,当您使用Html.Partial并且如果要发送ViewDataDictionary时..

为parentView发送的Model也可以用于partialViewName

一世。

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

这里,为'newViewDataDictionary'覆盖了为parentView发送的ViewData。

在这里,如果有一个用于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


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>

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

© www.soinside.com 2019 - 2024. All rights reserved.