我有一个控制器调用视图。在视图中有一个PartialView
称为@Html.Partial("ViewName", model).
这很好。
但是在controller
中我希望在viewbag中添加一些东西,这些东西很难放入我传递给视图的视图模型中。主视图访问ViewBag
没有问题,但在PartialView
它没有返回任何东西。
在这种情况下是否可以使用ViewBag
或者我应该将这些数据“破解”到我传递给视图的模型中(我传递给PartialView
的模型,以及我传递给嵌套在第一个PartialView
中的PartialView
的模型) ?
这应该没有任何问题。在我的HomeController Index操作中,我向ViewBag添加了一条消息:
ViewBag.Message = "Welcome to ASP.NET MVC!";
在索引视图上我添加了局部视图:
@Html.Partial("ViewName")
在部分视图中,我呈现消息:
@ViewBag.Message
从下面的注释:将模型传递给局部视图时似乎存在问题。然后你可以参考原始的ViewBag
@ViewContext.Controller.ViewBag.Message
如果你使用Html.Partial()
的重载,其中viewData
是输入参数之一,例如:
@Html.Partial("PartialViewName", Model, new ViewDataDictionary(ViewBag))
那么您的局部视图将不会看到原始ViewBag中的数据。
删除new ViewDataDictionary(ViewBag)
,所以你应该写
@Html.Partial("PartialViewName", Model)
在评论中TehOne说:
我知道这有点旧,但为了将来的参考,我通过使用ViewContext.Controller.ViewBag.Property来解决这个问题。当然这意味着您尝试访问的ViewBag属性是在控制器中设置的,但我认为这是一个很常见的情况。
哪个对我有用。
最近我遇到了同样的问题,但这里的答案只是解决方法,因为他们建议不使用Html.Partial
使用viewData
的重载。但如果你不得不使用这些重载,我相信正确的答案是:
@Html.Partial(
"PartialViewName",
model_object,
new ViewDataDictionary() { { "Value1InViewBag", ViewBag.Value1InViewBag }, { "Value2InViewBag", ViewBag.Value2InViewBag } }
)
我认为如果你需要传递不同的ViewDataDictionary
(例如我用它来改变HtmlFieldPrefix
),并且因为在视图中你应该知道,ViewBag
需要什么局部视图,所以应该使用这个答案,所以命名所有的不应该是问题ViewBag中的参数被复制到局部视图中使用的新ViewBag
(显然ViewBag
使用来自ViewData
的值)。
>在一般情况下,当您使用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
我的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>
我在一个非常基本的页面上遇到了同样的问题:
@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修复它。