将模型传递到局部视图

JTu*_*ney 2 c# asp.net-mvc razor asp.net-mvc-5

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

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

@Html.Partial("~/Views/Shared/Partial/_Address.cshtml")
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

传递到字典中的模型项的类型为"Data.Customer",但此字典需要"Data.Address"类型的模型项.

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

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

Dar*_*rov 8

我猜你的主要模型Data.Customer已经有一个或多个Data.Address你想要显示的类型的属性.所以你会使用@Html.Partial帮助器并传递这个属性的值,如下所示:

@Html.Partial("ViewName", Model.SomeAddressProperty)
Run Code Online (Sandbox Code Playgroud)

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

@Html.EditorFor(x => x.SomeAddressProperty)
Run Code Online (Sandbox Code Playgroud)

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

@Html.DisplayFor(x => x.SomeAddressProperty)
Run Code Online (Sandbox Code Playgroud)

这里的约定是模板的名称和位置.由于该类型SomeAddressPropertyAddress,ASP.NET MVC将寻找相应的Address.cshtml模板.

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