我有一个控制器调用视图。在视图中有PartialView
名为@Html.Partial("ViewName", model).
这样可以正常使用。
但是在controller
我希望在viewbag中添加一些东西很难放在viewmodel中我传递给视图。
主视图访问ViewBag
没有问题,但在PartialView
中它不会返回任何内容。
在这种情况下是否可以使用ViewBag
或者我应该将这些数据“破解”到我传递给视图的模型中(以及我传递给PartialView
的模型和模型我转到第一个PartialView
嵌套的PartialView
?
答案 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)