将模型传递给局部视图

Passing a model to a partial view

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

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

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

我得到的错误是:

The model item passed into the dictionary is of type 'Data.Customer', but this dictionary requires a model item of type 'Data.Address'.

我假设我收到此错误是因为在我的 CustomerInfo 视图中声明的模型是 Data.Customer 类型,它会自动尝试将它传递到我的 _Address 视图,该视图的模型类型是 Data.Address在里面。

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

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

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

作为使用 Html.Partial 助手的替代方法,您可以使用 Editor/Display 模板。他们按惯例工作。因此,将 _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 模板。

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

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

调用局部视图