将额外的 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 传递给强类型的局部视图的主要内容,如果未能解决你的问题,请参考以下文章

控制器向视图传递数据

如何将执行查询的结果放入 ViewData 并传递给视图

从控制器到视图的数据传递

[八] ASP.NET CoreMVC 中的视图

简述viewdata,viewbag和tempdata的区别

MVC 数据传递