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

时间:2009-07-23 01:47:55

标签: c# asp.net asp.net-mvc asp.net-mvc-partialview viewdata

我有一个强类型的部分视图,它接受一个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++;
}

9 个答案:

答案 0 :(得分:229)

RenderPartial采用另一个只是ViewDataDictionary的参数。你几乎就在那里,就这样称呼它:

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

请注意,这将覆盖默认情况下所有其他视图都具有的默认ViewData。如果要向ViewData添加任何内容,它将不会出现在您传递到局部视图的新词典中。

答案 1 :(得分:151)

要扩展发布的内容,如果您使用ViewDataDictionary的构造函数重载,那么可以传递新的视图数据,同时保留现有的视图数据:

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

答案 2 :(得分:38)

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

答案 3 :(得分:8)

我认为这不行吗?

ViewData["currentIndex"] = index;

答案 4 :(得分:6)

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

将新内容添加到课程中并在视图中返回。

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

希望这会有所帮助。如果没有,请告诉我,我会发布具体的代码。

答案 5 :(得分:4)

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

答案 6 :(得分:0)

您可以使用动态变量ViewBag

ViewBag.AnotherValue = valueToView;

答案 7 :(得分:0)

这也应该起作用。

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

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

答案 8 :(得分:0)

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

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

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