2017-08-23 2 views
1

Donc ce que j'essaie de faire est de faire une vue avec 2 de mes modèles. Pour que je fait ce viewmodel:Essayer de créer une vue avec 2 modèles donne une erreur

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace TimeTrackerProjectV2.Models 
{ 
    public class TimesheetInfoAndTimeSheet_DetailsViewModel 
    { 
     public IEnumerable<TimeSheet_Details> Details { get; set; } 
     public TimeSheetInfo Info { get; set; } 
    } 
} 

J'ai une méthode de contrôleur qui retourne mon viewmodel à mon avis comme celui-ci:

public ActionResult Edit(int id) 
     { 
      var inf = Repositories.TimeSheetRepository.GetTimesheetInfo(id); 
      var time = Repositories.Timesheet_DetailsRepo.GetTimeSheetThroughId(id); 
      var model = new TimesheetInfoAndTimeSheet_DetailsViewModel { Details = time.ToList(), Info = inf }; 

      return View(model); 
     } 

Mon vue ressemble actuellement à ceci:

@model IEnumerable<TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel> 

@{ 
    ViewBag.Title = "Edit"; 
} 

<h2>Edit</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<dl class="dl-horizontal"> 
@foreach (var item in Model) 
{ 

    <dt> 
     Month 
    </dt> 

    <dd> 
     @Html.DisplayFor(model =>) 
    </dd> 

    <dt> 
     Year 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => item.Info.Year) 
    </dd> 

    <dt> 
     Year 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => item.Info.Year) 
    </dd> 

    <dt> 
     Status 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => item.Info.StatusUnparsed) 
    </dd> 
    <dt> 
     User 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => item.Info.EmailUser) 
    </dd> 
    <dt> 
     Explanation 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => item.Info.Explanation) 
    </dd> 
} 
} 
</dl> 

<table class="table"> 
    <tr> 
     <th> 
      Date 
     </th> 
     <th> 
      Project 
     </th> 
     <th> 
      Task 
     </th> 
     <th> 
      Time Spent 
     </th> 
     <th></th> 
    </tr> 

    @foreach (var item in Model) 
    { 
     foreach(var i in item.Details) 
     { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => i.DayOfMonth) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => i.Project) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => i.Task) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => i.TimeSpent) 
      </td> 
     </tr> 
     } 
    } 

</table> 

Je reçois une erreur car im passi ng un seul objet ModelView pendant que ma vue attend un ennèlement. Mais quand je change de sorte que ma vue attend un seul objet je ne peux pas appeler la valeur de mes entités d'objet dans mon ViewModel parce que je ne peux plus faire un foreach avec mon modèle de vue. J'espère qu'il fait ce que j'essaie de dire. Quelle est la meilleure façon d'y parvenir?

Where i got my controller code example from

+0

d'abord, qu'est-ce que c'est? '@ Html.DisplayFor (model =>)' –

+0

Quelle erreur obtenez-vous? –

+1

Vous devez changer la déclaration à '@model TimesheetInfoAndTimeSheet_DetailsViewModel' et utiliser juste' @foreach (var item dans Model.Details) '(pas un' foreach (var item dans Model) ') –

Répondre

2

Il n'y a aucune raison d'utiliser une déclaration de IEnumerable dans votre vue. Il suffit de mettre ces lignes dans votre page d'affichage:

@model TimesheetInfoAndTimeSheet_DetailsViewModel 

    @{ 
     ViewBag.Title = "Edit"; 
    } 

    <h2>Edit</h2> 

    <p> 
     @Html.ActionLink("Create New", "Create") 
    </p> 
    <dl class="dl-horizontal"> 
    @foreach (var item in Model.Details) 
    { 
     <dt> 
      Month 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => item.Info.Month) 
     </dd> 

     <dt> 
      Year 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => item.Info.Year) 
     </dd> 

     <dt> 
      Year 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => item.Info.Year) 
     </dd> 

     <dt> 
      Status 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => item.Info.StatusUnparsed) 
     </dd> 
     <dt> 
      User 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => item.Info.EmailUser) 
     </dd> 
     <dt> 
      Explanation 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => item.Info.Explanation) 
     </dd> 
    } 
    </dl> 

    <table class="table"> 
     <tr> 
      <th> 
       Date 
      </th> 
      <th> 
       Project 
      </th> 
      <th> 
       Task 
      </th> 
      <th> 
       Time Spent 
      </th> 
      <th></th> 
     </tr> 

     @foreach (var item in Model.Details) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => i.DayOfMonth) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => i.Project) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => i.Task) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => i.TimeSpent) 
       </td> 
      </tr> 
      } 

    </table> 
0

Le principal problème est que vous essayez de parcourir votre modèle qui n'est pas itérable. La deuxième chose qui me dérange est que vous avez DisplayFor référence à rien (à côté de l'étiquette du mois).

Je ne sais pas exactement ce que vous essayez d'atteindre, mais votre code a quelques erreurs, mais essayez de changer les éléments suivants (j'omis un code pour la brièveté):

<dl class="dl-horizontal"> 
    <dt> 
     Year 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.Info.Year) 
    </dd> 
</dl> 


foreach(var detail in model.Details) 
{ 
     <tr> 
      <td> 
       @Html.DisplayFor(x=> detail.DayOfMonth) 
      </td> 
      <td> 
       @Html.DisplayFor(x=> detail.Project) 
      </td> 
     </tr> 
} 
0

Votre modèle est un un seul objet qui a en son sein une énumération, donc cela doit changer:

@model IEnumerable<TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel> 

à

@model TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel 

Vous n'avez pas besoin d'une boucle foreach pour vous faire référence à model.Info car il n'y a qu'une seule sorte la première boucle de foreach peut aller et vous pouvez simplement changer les références de

@Html.DisplayFor(model => item.Info.Year) 

à

@Html.DisplayFor(model => model.Info.Year) 

Votre boucle foreach finale passera de

@foreach (var item in Model) 

à

@foreach (var item in Model.Details)