2016-12-27 52 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

我僅添加了一個示例,您可以根據您的項目調整所需內容 –

相關問題