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

时间:2015-06-04 21:09:03

标签: asp.net-mvc viewmodel partial-views

我有一个视图,呈现2个部分视图。一部分是人员清单。另一部分是用于编辑单个人的模态编辑表单。我有一个viewmodel,包含一个人模型和一个人模型列表。我将viewmodel传递给视图并指定部分的特定模型。我得到一个错误,说该视图需要PersonModel而不是PersonViewModel。但是,视图需要viewmodel或它不起作用。

Viewmodel:

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)

person edit partial调用Person模型:

@model App.Models.Person

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

@model List<App.Models.Person>

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

2 个答案:

答案 0 :(得分:0)

我能够通过将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" })

答案 1 :(得分:0)

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

所以你最终得到了你的主虚拟机和2个较小的虚拟机。

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)