MVC4在多个视图中使用相同的局部视图

时间:2015-03-26 20:31:18

标签: asp.net-mvc-4 model-view-controller partial-views

我有一个“注册申请”视图,包含20个字段。用户注册。用户注册后,我有一个选项供用户更新已提交的组件。

例如:view Register有“联系信息”,“地址信息”等部分,目前有5个部分。

所以在Register视图中我创建了一个包含所有字段的viewmodel @model ViewModels.RegisterVM

对于编辑联系信息,我有自己的@model ViewModels.ContactInformationVM

现在,这是我的问题,因为两个视图将具有相同的标记代码我决定为联系信息创建部分视图,因此我可以重用标记代码,并且能够在一个地方而不是两个地方管理它。

所以在Register视图中

 @model ViewModels.RegisterVM
  .......
 @Html.Partial("~/Views/Shared/widget/_ContactInformation.cshtml", @Model)

并且在“联系信息”视图中,我想重用此部分视图

 @model ViewModels.ContactInformationVM` 
 @Html.Partial("~/Views/Shared/widget/_ContactInformation.cshtml", @Model)

两个视图都有自己的视图模型,部分视图只能接受一个视图模型

不知道我应该在局部视图中声明什么视图模型

我知道我可以从局部视图中复制代码并放在“注册”视图和“联系信息”视图中,它可以工作并解决问题..但是想知道是否有更好的方法可以避免使用相同的代码在多个文件中。

我希望我的意思是有道理的。谢谢阅读。

1 个答案:

答案 0 :(得分:1)

您要在此处创建一个复合视图模型,该模型将每个部分作为单独的属性。例如:

public class RegisterVM
{
    public ContactInformationVM ContactInformation { get; set; }
    public AddressInformationVM AddressInformation { get; set; }
    ...
}

然后在你的部分中,你引用了子模型:

<强> _ContactInformation.cshtml

@model ViewModels.ContactInformationVM

<!-- contact info fields here, for example: -->
@Html.EditorFor(m => m.FirstName)
...

然后,在您的注册视图中,您使用RegisterVM作为模型并加载每个部分的部分内容:

@model ViewModels.RegisterVM

@Html.Partial("_ContactInformation", Model.ContactInformation)
@Html.Partial("_AddressInformation", Model.AddressInformation)
...

现在,您可以随意重用这些组件。