2016-12-27 58 views
2

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

我有事件一个模型类和一个,这是我的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

你尝试过这样的@ Html.RenderPartial( “_ PersonEventList”(名单)ViewBag.data) –

+0

我没有,但仍然给我一个错误,类似于之前所说的:'不能将类型'void'隐式转换为'object'。表达式必须返回一个值来呈现.' – techturtle

+0

尝试类似这样的操作,@ Html.Partial(“View”,Model); @ {HTML。RenderPartial(“viewName”,Model));} –

回答

0

假设你想在你的部分 “事件”,部分应采取List<Event>,因为它的模型:

@model IEnumerable<Event> (or List<Event>) 
在主视图

然后:

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

所以,我在读的时候(所以在其他地方)似乎都认为像这样的数据应该通过强类型的ViewModel传递,但是这看起来像是建议回到模型本身。或者我错过了什么? – techturtle

+0

此外,我尝试切换到您的建议代码,但如果我使用'RenderPartial'命令,我得到无处不在'不能隐式转换类型'void'到'object''错误(它不告诉我什么)。如果我把它留在'@ Html.Partial',那么它看起来没问题。一直未能弄清楚为什么,但由于我无法获得局部视图的工作,我不知道它是否会产生任何影响。 – techturtle

+0

当你做@ Html.Partial(“_ PersonEventList”,Model.Events)时会发生什么? –

0

由于@Barry富兰克林说,你应该改变你的偏好来接受事件列表。我想提到的另一件事是你应该使用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> 
} 
+0

首先,'@model IEnumerable '不起作用,因为没有名为Event的ViewModel。如果我制作PersonEventViewModel,那么它说没有任何东西叫做事件或事件。如果我把它做成Proj.Models.Event,那么Visual Studio对它来说都是可以的,它甚至似乎运行良好,直到我尝试查看Details页面。然后它抛出错误“无法创建类型'Proj.Models.Person'的常量值。只有原始类型或枚举类型在此上下文中受支持。'@foreach(Model中的var item){'。不知道这个错误的含义。 – techturtle

+0

只需将其替换为您的事件模型所在的命名空间 –

+0

我仅添加了一个示例,您可以根据您的项目调整所需内容 –