【问题标题】:Passing a model to a partial view将模型传递给局部视图
【发布时间】:2015-02-14 19:43:04
【问题描述】:

我有一个 _Address 部分视图。此部分视图包含与地址模型匹配的所有地址字段。在此视图的顶部,我将模型设置为:
@model 数据地址

在我的 CustomerInfo 视图中,我尝试以下方法将地址字段呈现为我的表单的一部分:

@Html.Partial("~/Views/Shared/Partial/_Address.cshtml")

我得到的错误是:

传入字典的模型项是“Data.Customer”类型, 但是这个字典需要一个“Data.Address”类型的模型项。

我假设我收到了这个错误,因为在我的 CustomerInfo 视图中声明的模型是 Data.Customer 类型,它会自动尝试将它传递给我的 _Address 视图,其中有一个 Data.Address 类型的模型。

什么是使这种流动正确的正确方法?我注意到还有一个 @Html.RenderPartial("ViewName", model) 助手,但不知道如何传递它 Data.Address 因为我的 CustomerInfo 视图中的主要模型是 Data.Customer。

【问题讨论】:

    标签: c# asp.net-mvc razor asp.net-mvc-5


    【解决方案1】:

    我猜您的主要模型Data.Customer 已经有一个或多个您想要显示的Data.Address 类型的属性。因此,您将使用 @Html.Partial 帮助器并像这样传递此属性的值:

    @Html.Partial("ViewName", Model.SomeAddressProperty)
    

    作为使用Html.Partial 助手的替代方法,您可以使用编辑器/显示模板。他们按惯例工作。所以将你的_Address.cshtml部分重命名为~/Views/Shared/EditorTemplates/Address.cshtml,然后在你的主视图中使用:

    @Html.EditorFor(x => x.SomeAddressProperty)
    

    或者如果部分不包含输入字段或表单,您可以使用显示模板:~/Views/Shared/DisplayTemplates/Address.cshtml,然后:

    @Html.DisplayFor(x => x.SomeAddressProperty)
    

    这里的约定是模板的名称和位置。由于SomeAddressProperty的类型是Address,ASP.NET MVC会寻找对应的Address.cshtml模板。

    如果您的主视图模型没有地址属性,您应该继续添加一个或多个此类属性,然后在渲染主视图的控制器操作中填充它们。然后,您可以为这些属性中的每一个调用部分。

    【讨论】:

    • 由于我使用的是 EF6 并且客户有一个 AddressId 字段,因此我能够执行 @Html.EditorFor(x => x.Address) 并且在我的 Address.cshtml EditorTemplate 中,我在顶部声明的模型是@model 数据地址。一切都很好,尽管我想知道保存是如何工作的。我让它适用于客户字段,但不确定如何事先将新地址保存到地址表中。另外,我什么时候应该使用 EditorTemplates 和 PartialViews。在这种情况下,Address.cshtml 是表单的所有字段,那么使用 EditorTemplate 是否更有意义?
    • 使用EditorTemplate,它将正确地为您的控件添加前缀(例如<input name="Address.Street" ..>,它将在回发时正确绑定到属性Address。使用部分将导致<input name="Street" ..>` 除非您还将前缀传递给部分(例如根据this example
    【解决方案2】:

    首先,不要将Data.Customer 传递给您的主视图,而只能传递“数据”。这更灵活,您所要做的就是修复主视图中的引用,因此您可以使用@Model.Customer.FirstName 而不是@Model.FirstName。这样,您可以使用更明确的@Html.Partial("~/Views/Shared/Partial/_Address.cshtml", @Model.Address) 调用局部视图。

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2023-04-01
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多