使用 viewmodel 将不同的视图传递给分部视图

Using viewmodel to pass different views to partial views

我有一个呈现 2 个局部视图的视图。其中一部分是人员列表。另一部分是用于编辑单个人的模态编辑表单。我有一个包含人物模型和人物模型列表的视图模型。我将视图模型传递给视图并为部分指定特定模型。我收到一条错误消息,指出视图需要 PersonModel 而不是 PersonViewModel。但是,视图需要视图模型,否则将无法工作。

视图模型:

public class PersonViewModel
{
    public Person Person { get; set; }
    public List<Person> PeopleList { get; set; }
}

视图(索引):

@model App.Models.ViewModels.PersonViewModel
<h1>Manage People</h1>

@Html.Partial("_personEditForm", Model.Person)
@Html.Partial("_PersonGrid", Model.PersonList)

人物编辑部分调用人物模型:

@model App.Models.Person

网格部分调用与列表相同的模型:

@model List<App.Models.Person>

如果页面只有一个部分,这工作正常,但这是我第一次尝试使用 2,但失败了。 Index 视图必须有 ViewModel 才能使部分视图工作,所以不确定为什么它不接受它。

我能够通过将 ViewModel 传递给视图并将其传递给两个部分来解决此问题:

@model App.Models.ViewModels.PersonViewModel

<h1>Manage People</h1>

@Html.Partial("_PersonEditForm", Model)
@Html.Partial("_PersonGrid", Model)

然后在 partials 中,我在 viewmodel 中指定了模型。例如,在部分形式中,文本框助手来自:

@Html.TextBoxFor(m => m.FirstName, new { @class = "form-control" })

@Html.TextBoxFor(m => m.Person.FirstName, new { @class = "form-control" })

只想加上我的 2 美分,因为这也让我发疯。我所做的是为每个部分视图创建单独的视图模型。一种类似于PersonEdit,一种类似于PersonList。

所以您最终得到了主 VM 和 2 个较小的 VM。

public class PersonIndexViewModel
{
    public PersonEditViewModel Person { get; set; }
    public List<PersonListViewModel> PeopleList { get; set; }
}

public class PersonEditViewModel
{
//    ...whatever info you want in your edit view
}

public class PersonListViewModel
{
//    ... whatever info you want in your table grid
}

那你就这样称呼它

@model App.Models.ViewModels.PersonViewModel

<h1>Manage People</h1>

@Html.Partial("_PersonEditForm", Model.Person)
@Html.Partial("_PersonGrid", Model.PeopleList)