如何配置ViewModel和Partial Page以包含IEnumerable

时间:2016-12-27 09:15:54

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

我试图将我的ASP.NET MVC项目从直接视图和模型更改为使用ViewModel中间层。基本上,我所做的包括让与他们相关联的零个或多个事件。我正在更改为ViewModel,因为我想在详细信息页面上显示部分视图,该页面显示所有关联的事件

我有一个模型类和一个事件,这是我的ViewModel:

public class PersonEventViewModel
{
    public PersonEventViewModel(Person person)
    {
        Person = person;
    }

    public Person Person { get; set; }
    public IEnumerable<Event> Events { get; set; }

}

这适用于转换我的单个记录页面。在人员详细信息这样的页面上,我不得不将@Html.DisplayFor(model => model.CreatedOn)之类的行更改为@Html.DisplayFor(model => model.Person.CreatedOn),以便正确找到属性,但它有效。然而,在我尝试制作的局部视图中,我似乎无法让它们在那里显示模型的属性。看起来或多或少是这样的:

@model IEnumerable<Proj.ViewModels.PersonEventViewModel>

<table class="table">
    <tr>
        <th>@Html.DisplayNameFor(model => model.RecordedOn)</th>
        <th>@Html.DisplayNameFor(model => model.RecordedBy)</th>
        <th>@Html.DisplayNameFor(model => model.Comments)</th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>@Html.DisplayFor(modelItem => item.RecordedOn)</td>
        <td>@Html.DisplayFor(modelItem => item.RecordedBy)</td>
        <td>@Html.DisplayFor(modelItem => item.Comments)</td>
    </tr>
}

当它直接使用事件模型时,这很有用,但现在看起来我在model和属性之间放置的东西并不重要,它总是告诉我它不能解决它。

另外,我不确定如何将ViewModel传递给局部视图。我还没想出要放在这里的东西:

@Html.RenderPartial("_PersonEventList", ?????)

我传递模型或模型信息的各种尝试都遇到了错误。

根据请求,这是我的详细信息页面的来源,我试图放置事件的部分视图。

@model Proj.ViewModels.PersonEventViewModel
@{ ViewBag.Title = "Details"; }
<h2>Details</h2>
<div>
    <h4>Person</h4> <hr/>
    <dl class="dl-horizontal">
        <dt>@Html.DisplayNameFor(model => model.Person.FirstName)</dt>
        <dd>@Html.DisplayFor(model => model.Person.FirstName)</dd>
        @*...and so on through the fields...*@
    </dl>
</div>
<p> @Html.ActionLink("Edit Record", "Edit", new {id = Model.Person.PersonId}) </p>

@Html.RenderPartial("_PersonEventList", Model)

2 个答案:

答案 0 :(得分:0)

假设你想要&#34;事件&#34;在您的部分内容中,部分内容应采用List<Event>作为其模型:

@model IEnumerable<Event> (or List<Event>)

然后在主视图中:

@Html.RenderPartial("_PersonEventList", Model.Events)

答案 1 :(得分:0)

正如@Barry Franklin所说,你应该改变你的部分接受一个事件列表。我想提到的另一件事是你应该使用Partial而不是RenderPartial。 RenderPartial需要用括号括起来并且有一个;在它的最后,为了它的工作(Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction)。

@Html.Partial("_PersonEventList", Model.Events)

您还需要更新部分代码:

    @model IEnumerable<Proj.ViewModels.Event>

<table class="table">
@foreach (var item in Model) {
    <tr>
        <td>@Html.DisplayFor(modelItem => item.RecordedOn)</td>
        <td>@Html.DisplayFor(modelItem => item.RecordedBy)</td>
        <td>@Html.DisplayFor(modelItem => item.Comments)</td>
    </tr>
}