我试图将我的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)
答案 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>
}