【问题标题】:Pass Additional ViewData to a Strongly-Typed Partial View将额外的 ViewData 传递给强类型的局部视图
【发布时间】: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++;
}

【问题讨论】:

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


    【解决方案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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 2019-02-01
            • 1970-01-01
            • 2014-06-28
            • 1970-01-01
            相关资源
            最近更新 更多