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

Nat*_*lor 169 c# asp.net asp.net-mvc viewdata asp.net-mvc-partialview

我有一个强类型的局部视图,它接受一个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++;
}
Run Code Online (Sandbox Code Playgroud)

wom*_*omp 239

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary { { "index", index } }
); 
Run Code Online (Sandbox Code Playgroud)

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

  • 我建议查看下面的ctorx答案.他向现有的ViewData添加了额外的数据. (5认同)
  • @programad尝试从@Html.RenderPartial()中删除@,这解决了我的问题,但我在@ {}代码块内的一行上调用了RenderPartial(). (4认同)
  • 我正在尝试执行此操作,并且返回“无法将void转换为对象”。 (2认同)

cto*_*orx 157

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是更好的解决方案.丢失ViewData意味着您将丢失ModelState和所有验证.+1 (9认同)
  • 如果您需要在子控件中保留`TemplateInfo.HtmlFieldPrefix`,这将非常有用,否则将被重置 (3认同)

mut*_*vel 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" } });}
Run Code Online (Sandbox Code Playgroud)

部分页面(_Header):

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是最完整的答案(尽管.ToString()是不必要的). (2认同)

Joe*_*nez 8

我觉得这应该不行?

ViewData["currentIndex"] = index;
Run Code Online (Sandbox Code Playgroud)

  • 虽然这不是一个非常强大的方法,但它确实帮助我弄清楚如何从Womp的答案中检索视图数据值. (6认同)

小智 7

我知道这是一篇旧帖子,但我在使用 core 3.0 遇到类似问题时遇到了它,希望它对某人有所帮助。

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

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />
Run Code Online (Sandbox Code Playgroud)


gri*_*egs 6

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

将新内容添加到类中并在视图中返回.

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

希望这可以帮助.如果没有,请告诉我,我会发布具体代码.