向强类型的局部视图传递附加的ViewData

189

我有一个强类型的Partial View,它需要一个ProductImage,当它被渲染时,我还想为它提供一些在包含页面动态创建的额外ViewData。如何在RenderPartial调用中同时传递我的强类型对象和自定义的ViewData给Partial View?

var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
{
  Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
  index++;
}
9个回答

267

RenderPartial 方法需要另外一个参数,即 ViewDataDictionary。你已经接近成功了,只需像这样调用它:

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

请注意,这将覆盖所有其他视图默认具有的默认ViewData。如果您向ViewData添加任何内容,则不会在将其传递给部分视图的新字典中出现。


3
我正在尝试做这件事,但返回了“无法将 void 转换为对象”的错误提示。 - programad
4
尝试从@Html.RenderPartial()中删除@符号,这对我解决了问题。但是要注意,在@ {}代码块中调用RenderPartial()的行也需要更改。 - danjarvis
6
我建议查看下面ctorx的答案。他为现有的ViewData添加了额外的数据。 - Jón Trausti Arason

181

扩展womp的回答,如果您使用ViewDataDictionary的构造函数重载,则可以在保留现有View Data的同时传递新的View Data:

代码如下:

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

4
如果您需要保留 TemplateInfo.HtmlFieldPrefix 在子控件中,否则它将被重置,那么这将非常有用。 - Simon_Weaver
14
这绝对是更好的解决方案。失去ViewData意味着您失去了ModelState和所有验证。+1 - Kevin Farrugia
这似乎只在您的ViewDataDictionary中不传递TemplateInfo.HtmlFieldPrefix时才有效。我只能像答案中所示那样传递一个变量,或者传递一个TemplateInfo.HtmlFieldPrefix,但不能同时传递两者。 - Ferox

50
@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() 是不必要的)。 - Colin

11

我认为这应该能行,不是吗?

ViewData["currentIndex"] = index;

7
虽然这不是很有效的方法,但它确实帮助我从Womp的答案中找出如何检索视图数据值。 - Mathias Lykkegaard Lorenzen

7

我知道这是一篇旧文章,但当我面临与核心3.0类似的问题时,偶然遇到了它,希望它能帮助到某人。

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

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

6

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

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

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

希望这可以帮助您。如果不能,请告诉我,我将发布具体的代码。


4

传递附加数据的最简单方法是将数据添加到视图的现有ViewData中,正如@Joel Martinez所指出的那样。然而,如果您不想污染您的ViewData,RenderPartial还有一个方法,除了您展示的两个参数版本外,还有三个参数。第三个参数是ViewDataDictionary。您可以构建一个单独的ViewDataDictionary,仅包含您想要传递的额外数据的部分。


3
这应该也可以工作。
this.ViewData.Add("index", index);

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

谢谢!当您为子部分扩展ViewData字典等时,这真的非常有用。 - developius

-1

您可以使用动态变量ViewBag

ViewBag.AnotherValue = valueToView;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接