2016-12-27 4 views
2

ASP.NET MVCプロジェクトをまっすぐなビューとモデルからViewModel中間層を使用するように変更しようとしています。基本的には、に0以上のというイベントが関連付けられています。が関連付けられています。 Person Details イベントのすべてを表示している詳細ページを表示したいので、私はViewModelに変更します。IEnumerableを含めるためにViewModelとPartial Pageを構成する方法

私はモデルクラスとイベントのための1つを持っており、これが私のViewModelです:

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

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

} 

これは私のシングル・レコード・ページを変換するための罰金働きました。 Person Detailsのようなページでは、@Html.DisplayFor(model => model.CreatedOn)のような行を@Html.DisplayFor(model => model.Person.CreatedOn)に変更しなければならなかったので、プロパティを正しく見つけることができましたが、うまくいきました。私が作ろうとしている部分的な見解では、そこにモデルの特性を示すようには思えません。これは、多かれ少なかれ、次のようになります。それは直接イベントモデルを使用していたが、今では私がmodelとプロパティの間に置くかは重要とは思われないとき

@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> 
} 

これが働いて、それは常にことを私に伝えますそれを解決することはできません。

また、ViewModelを部分ビューに渡す方法がわかりません。私はまだここに置くために何を考え出したていない:モデルやモデルの情報を渡すために

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

私の様々な試みがすべてのエラーで満たされています。


リクエストごとに、これは私の詳細ページのソースで、イベントの部分的な表示を試みています。あなたのメインビューで次に

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

:それは、モデルのよう

@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

あなたは、私がいなかった( "_ PersonEventList"、(一覧)ViewBag.data) –

+0

Html.RenderPartial @次のように試してみましたしかし、それでも私には以前に言われたことと同様のエラーが出ています: '暗黙のうちに 'void'型を 'object'に変換できません。式はレンダリングする値を返す必要があります。 ' – techturtle

+0

@ Html.Partial( "View"、Model); @ {Html。RenderPartial( "viewName"、Model));} –

答えて

0

あなたの部分で "イベント" をしたいと仮定すると、部分的にはList<Event>を取る必要があります@Barryとして

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

だから、私が読んでいたところでは、このようなデータは強く型付けされたViewModelを介して渡されるべきだと思われるようですが、これはModel自体に戻ることを示唆しているようです。または私は何かを逃していますか? – techturtle

+0

また、私はあなたの提案したコードに切り替えようとしましたが、 'RenderPartial'コマンドを使うと、' void 'から' object''に暗黙的に変換することはできません。 '@ H​​tml.Partial'に置いておけばそれでOKです。理由を理解することができませんでしたが、部分的な見解がうまくいかないので、何か違いがあるかどうかはわかりません。 – techturtle

+0

@ Html.Partial( "_ PersonEventList"、Model.Events)を実行するとどうなりますか? –

0

をフランクリンは、イベントのリストを受け入れるようにあなたの部分を変更する必要があると述べました。私が言いたいことは、RenderPartialではなくPartialを使用するべきであるということです。 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

EventというViewModelがないため、 '@model IEnumerable 'は機能しません。 PersonEventViewModelを作成すると、イベントまたはイベントと呼ばれるものは存在しないと表示されます。私がProj.Models.Eventにすると、Visual StudioはすべてそれでOKで、詳細ページを表示しようとするまでは正常に動作しているように見えます。次に、 'Proj.Models.Person型の定数値を作成できません。'というエラーが表示されます。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています.' @foreach(モデル内のvar item){'。このエラーが何を意味するのか分かりません。 – techturtle

+0

ちょうどあなたのイベントモデルが住んでいる名前空間に置き換えます –

+0

私は例として、あなたのプロジェクトに基づいて必要なものを調整することができます –

関連する問題