将模型传递到局部视图

时间:2015-02-14 19:43:04

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

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

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

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

我得到的错误是:

  

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

的模型项

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

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

2 个答案:

答案 0 :(得分:8)

我猜您的主要模型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)

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

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

此处的约定是模板的名称和位置。由于SomeAddressProperty的类型为Address,因此ASP.NET MVC将查找相应的Address.cshtml模板。

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

答案 1 :(得分:2)

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