将其他ViewData传递到强类型的局部视图


173

我有一个采用ProductImage的强类型部分视图,并且在呈现它时,我还想为其提供一些其他ViewData,这些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++;
}

Answers:


249

RenderPartial采用另一个参数,它只是一个ViewDataDictionary。您快到了,就这样称呼它:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary { { "index", index } }
); 

请注意,这将覆盖所有其他视图默认具有的默认ViewData。如果要向ViewData添加任何内容,则传递给局部视图的内容将不在此新词典中。


2
我正在尝试执行此操作,并且返回“无法将void转换为对象”。
programad 2012年

4
@programad尝试从@ Html.RenderPartial()中删除@,这为我解决了该问题,但是我在@ {}代码块内的一行上调用了RenderPartial()。
danjarvis 2012年

5
我建议在下面查看ctorx的答案。他将其他数据添加到现有的ViewData中。
raRaRa16年

161

为了扩大在什么womp贴,你可以,如果你使用的构造函数重载通过新的查看数据,同时保留现有的查看数据ViewDataDictionary,如下所示:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 

3
如果您需要保留TemplateInfo.HtmlFieldPrefix子控件,这将非常有用,否则将被重置
Simon_Weaver13年

12
这绝对是更好的解决方案。丢失ViewData意味着您丢失了ModelState和所有验证。+1
Kevin Farrugia

仅当您未在ViewDataDictionary中传递TemplateInfo.HtmlFieldPrefix时,这才似乎有效。我只能传递答案中未说明的变量,或者传递TemplateInfo.HtmlFieldPrefix,但不能两者都传递。
Ferox

43
@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>

2
这似乎是最完整的答案(尽管.ToString()是不必要的)。
科林


6

创建另一个包含强类型类的类。

将您的新内容添加到该类中,然后在视图中返回它。

然后在视图中,确保您继承新类并更改现在将出错的代码位。即对您的字段的引用。

希望这可以帮助。如果没有,请告诉我,我将发布特定代码。


4

传递附加数据的最简单方法是将数据添加到视图的现有ViewData中,如@Joel Martinez所述。但是,如果您不想污染您的ViewData,RenderPartial的方法将使用三个参数以及您显示的两个参数的版本。第三个参数是ViewDataDictionary。您可以为仅包含要传递的额外数据的部分构造一个单独的ViewDataDictionary。


1

这也应该起作用。

this.ViewData.Add("index", index);

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 

谢谢!这是真正有用的,当你扩展ViewData字典儿童的谐音等等
developius

1

我知道这是一篇旧文章,但是当我遇到使用Core 3.0的类似问题时,希望能对您有所帮助。

@{
Layout = null;
ViewData["SampleString"] = "some string need in the partial";
}

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />

0

您可以使用动态变量ViewBag

ViewBag.AnotherValue = valueToView;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.