我有一个_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。
答案 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)
调用部分视图。