2016-12-27 5 views
2

ASP.NET MVC 프로젝트를 ViewModel 중간 계층을 사용하여 직선 뷰 및 모델로 변경하려고합니다. 기본적으로, 내가하고있는 일은 사람이 0 이상인 것입니다. 이벤트이 연결되어 있습니다. 부분보기를 넣으려는 바람에 ViewModel로 바뀌고 있습니다. 사람 모든 관련 이벤트을 보여주는 세부 정보 페이지입니다. ViewModel 및 부분 페이지에서 IEnumerable을 포함하도록 구성하는 방법

나는 이벤트에 대한 사람 모델 클래스와 하나가,이 내 뷰 모델입니다 :

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

나는하지 않았다 :

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

는 또한 부분적인 코드를 업데이트해야 그러나 그것은 여전히 ​​나에게 이전에 말한 것과 비슷한 오류를 준다.''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로 Franklin은 이벤트 목록을 허용하도록 부분을 변경해야한다고 말했습니다. 내가 언급하고 싶은 또 다른 점은 RenderPartial이 아닌 Partial을 사용해야한다는 것입니다. RenderPartial은 대괄호로 묶고, 그것의 끝에서 작동하도록 (Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction).

@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을 만들면 Event 또는 Events라는 것이 없습니다. Proj.Models.Event로 만들면 Visual Studio에서 모두 정상적으로 작동하며 세부 정보 페이지를 보려고 시도 할 때까지 정상적으로 실행됩니다. 그런 다음 'Proj.Models.Person'유형의 상수 값을 생성 할 수 없습니다라는 오류가 발생합니다. '@foreach (모델의 var item) {'의 줄에는이 기본 문맥에서만 기본 유형이나 열거 형 만 지원됩니다. 이 오류가 무엇을 의미하는지는 알 수 없습니다. – techturtle

+0

그냥 이벤트 모델에 살고있는 네임 스페이스로 바꿉니다. –

+0

예를 들어, 프로젝트에 따라 필요한 것을 조정할 수 있습니다. –