将额外的 ViewData 传递给强类型的局部视图
Posted
技术标签:
【中文标题】将额外的 ViewData 传递给强类型的局部视图【英文标题】:Pass Additional ViewData to a Strongly-Typed Partial View 【发布时间】:2010-11-13 05:46:15 【问题描述】:我有一个采用 ProductImage 的强类型局部视图,当它被渲染时,我还想为它提供一些我在包含页面中动态创建的额外 ViewData。如何通过 RenderPartial 调用将我的强类型对象和自定义 ViewData 都传递给局部视图?
var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
index++;
【问题讨论】:
【参考方案1】:RenderPartial 采用另一个参数,它只是一个 ViewDataDictionary。你快到了,就这样称呼它:
Html.RenderPartial(
"ProductImageForm",
image,
new ViewDataDictionary "index", index
);
请注意,这将覆盖所有其他视图默认拥有的默认 ViewData。如果您要向 ViewData 添加任何内容,则它不会在您传递给局部视图的这个新字典中。
【讨论】:
我正在尝试执行此操作,但它返回“无法将 void 转换为对象”。 @programad 尝试从@Html.RenderPartial() 中删除@,这为我解决了这个问题,但我在@ 代码块内的一行上调用了RenderPartial()。 我建议在下面查看 ctorx 的答案。他向现有的 ViewData 添加了额外的数据。【参考方案2】:要扩展 womp 发布的内容,如果您使用 ViewDataDictionary
的构造函数重载,您可以在保留现有视图数据的同时传递新的视图数据,如下所示:
Html.RenderPartial(
"ProductImageForm",
image,
new ViewDataDictionary(this.ViewData) "index", index
);
【讨论】:
如果您需要在子控件中保留TemplateInfo.HtmlFieldPrefix
,否则这将非常有用
这绝对是更好的解决方案。丢失 ViewData 意味着您丢失了 ModelState 和所有验证。 +1
这似乎只有在您没有在 ViewDataDictionary 中传递 TemplateInfo.HtmlFieldPrefix 时才有效。我只能传递答案中说明的变量,或者传递 TemplateInfo.HtmlFieldPrefix 但不能同时传递两者。【参考方案3】:
@Html.Partial("_Header", new ViewDataDictionary "HeaderName", "User Management" , "TitleName", "List Of Users" )
or
@Html.RenderPartial("_Header", new ViewDataDictionary "HeaderName", "User Management" , "TitleName", "List Of Users" );
部分页面(_Header):
<div class="row titleBlock">
<h1>@ViewData["HeaderName"].ToString()</h1>
<h5>@ViewData["TitleName"].ToString()</h5>
</div>
【讨论】:
这似乎是最完整的答案(尽管 .ToString() 是不必要的)。【参考方案4】:我认为这应该行不通?
ViewData["currentIndex"] = index;
【讨论】:
虽然这不是一种非常强大的方法,但它确实帮助我弄清楚了如何从 Womp 的答案中检索视图数据值。【参考方案5】:创建另一个包含强类型类的类。
将你的新内容添加到类中并在视图中返回。
然后在视图中,确保继承新类并更改现在出错的代码位。即对您的字段的引用。
希望这会有所帮助。如果没有,请告诉我,我会发布具体代码。
【讨论】:
【参考方案6】:我知道这是一篇旧帖子,但我在使用 core 3.0 遇到类似问题时遇到了它,希望它对某人有所帮助。
@
Layout = null;
ViewData["SampleString"] = "some string need in the partial";
<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />
【讨论】:
【参考方案7】:如@Joel Martinez 所述,传递附加数据的最简单方法是将数据添加到视图的现有 ViewData 中。但是,如果您不想污染您的 ViewData,RenderPartial 有一个方法,它接受三个参数以及您显示的两个参数版本。第三个参数是 ViewDataDictionary。您可以为您的部分构造一个单独的 ViewDataDictionary,其中仅包含您要传入的额外数据。
【讨论】:
【参考方案8】:这也应该有效。
this.ViewData.Add("index", index);
Html.RenderPartial(
"ProductImageForm",
image,
this.ViewData
);
【讨论】:
谢谢!当您为子部分等扩展 ViewData 字典时,这非常有用【参考方案9】:可以使用动态变量ViewBag
ViewBag.AnotherValue = valueToView;
【讨论】:
以上是关于将额外的 ViewData 传递给强类型的局部视图的主要内容,如果未能解决你的问题,请参考以下文章