2011-04-20 48 views
47

我有一个控制器调用视图。在视图中有一个PartialView叫做@Html.Partial("ViewName", model).这工作正常。无法在ASP.NET MVC3的局部视图中访问ViewBag

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

是否有可能在这种情况下使用ViewBag或我应该“黑客”这个数据到我传递到视图的模型(我传递给PartialView模型,并且模型我传递给嵌套在PartialView第一个PartialView)?

+0

有关动态的一件事就是它区分大小写 – Buildstarted 2011-04-20 15:07:08

+5

我非常愚蠢的是,我真的为这个非常糟糕的问题赢得了金徽章。我有点惭愧。 – SoonDead 2013-02-22 12:10:35

+0

我的错误是,我在链中使用了@ Html.Action而没有记住它。 – SoonDead 2011-04-21 05:43:55

回答

35

这应该没有任何问题。在我的HomeController中Index操作我想补充一个信息,ViewBag:

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

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

@Html.Partial("ViewName") 

而且在局部视图我渲染消息:

@ViewBag.Message 

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

+26

我发现如果您使用@ Html.Partial(“ViewName”,Model),那么viewbag的其余部分将不可用。 – 2012-07-17 18:53:15

+2

你确定吗?对我来说,只有当你指定显式的viewData时才是这种情况。像这样:@ Html.Partial(“ViewName”,Model,ViewData)否则ViewBag是完全可访问的。 – 2013-04-30 09:05:50

+20

我知道这有点旧,但为了将来的参考,我通过使用'ViewContext.Controller.ViewBag.Property'解决了这个问题。当然这意味着你试图访问的'ViewBag'属性是在控制器中设置的,但我认为这是一个常见的情况。 – TehOne 2013-05-15 19:47:17

28

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

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

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

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

@Html.Partial("PartialViewName", Model) 
+1

请注意,我已经找到了错误的原因,所以这个答案可能有点难以具有任何相关性。 – SoonDead 2013-06-17 12:15:17

+9

@SoonDead但这个答案仍然相关谷歌来这里:) – 2013-10-17 15:09:13

+0

@EvgenyLevin这是真的。 – SoonDead 2013-10-17 15:16:15

8

在评论TehOne说:

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

这是为我工作。

7

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

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

我认为,如果你需要通过不同的这个答案应该使用ViewDataDictionary(如我我们来说,改变HtmlFieldPrefix),并因为在视图你应该知道,ViewBag需要什么局部视图,所以将ViewBag中的所有参数都复制到局部视图中使用的新的ViewBag(显然ViewBag使用的值为ViewData)应该不是问题。

0

我的塞纳里奥是,我曾与型号IEnumerable<SampleModel> 局部视图,但是我不得不用,怎么Model.SampleModelList可以null

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

简单的解决方案是通过自PartialView现在也考虑每一个的一部分View上的元素可以通过PartialView访问,所以我没有将ViewBag数据设置为View html上的数据元素,而不是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修复了它。