2015-10-20 3 views
-4

я получил ошибку:ICollection в представлении ASP.NET

System.Collections.Generic.HashSet`1[CTCSAgenda.Models.Evenement] 

сообщение, когда я пытаюсь перечислить мой ICollection в представлении.

Вот моя модель Personne:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 
using System.Web; 

namespace CTCSAgenda.Models 
{ 
    // Classe Personne ayant une relation Many to Many avec la Classe Evenement, ce qui permet de générer une table intermédiaire Personne/Evenement lors de la génération des tables. 
    // Etant donnée qu'une Personne peut s'inscrire à plusieurs Evenements et plusieurs Personnes peuvent s'inscrire à un même Evenement. 
    // Il y a également une relation One to Many entre Personne et StatutPersonne 
    // En effet, le statut est unique pour une Personne distincte et un statut peut être porté par plusieurs Personnes 
    [Table("PERSONNE")] 
    public class Personne 
    { 
     #region Properties nolink 
     // Propriétés de la classe User 
     [Key] 
     [Column("ID_PERSONNE")] 
     //[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int IdPersonne { get; set; } 
     //[Required] 
     [Column("NOM_PERSONNE")] 
     [MaxLength(255)] 
     public string NomPersonne { get; set; } 
     [Column("PRENOM_PERSONNE")] 
     [MaxLength(255)] 
     public string PrenomPersonne { get; set; } 
     [Column("LOGIN_PERSONNE")] 
     [MaxLength(128)] 
     [Display(Name = "Nom d’utilisateur: ")] 
     public string LoginPersonne { get; set; } 
#endregion 
     #region Properties link 
     // Lien Many to Many avec Evenement (Une personne peut s'inscrire à plusieurs Evenements) 
     [Column("ID_EVENEMENT")] 
     [ForeignKey("IdEvenement")] 
     public virtual ICollection<Evenement> Evenements { get; set; } 
     // Lien One to Many avec Statut (Une personne a 1 et 1 seul statut) 
     [Column("ID_STATUT_PERSONNE")] 
     public int IdStatutPersonne { get; set; } 
     [ForeignKey("IdStatutPersonne")] 
     public virtual StatutPersonne statutsPersonne { get; set; } 
     #endregion 
    } 
} 

Моя модель Evenement:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 
using System.Web; 

namespace CTCSAgenda.Models 
{ 
    [Table("EVENEMENT")] 
    public class Evenement 
    { 
     #region Properties nolink 
     [Key] 
     [Column("ID_EVENEMENT")] 
     //[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int IdEvenement { get; set; } 
     [Column("TITRE_EVENEMENT")] 
     [Required] 
     [Display(Name = "Titre: ")] 
     public string TitreEvenement { get; set; } 
     [Column("DATE_EVENEMENT")] 
     [Required] 
     [Display(Name = "Date: ")] 
     // Pour afficher uniquement la date sans l'heure 
     [DataType(DataType.Date)] 
     public DateTime DateEvenement { get; set; } 
     [Column("HEURE_EVENEMENT")] 
     [Required] 
     [Display(Name = "Heure: ")] 
     [DataType(DataType.Time)] 
     [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "hh:mm tt")] 
     public DateTime HeureEvenement { get; set; } 
     [Column("CAPACITE_EVENEMENT")] 
     [Display(Name = "Capacité: ")] 
     [Range(0,1000)] 
     public int Capacite { get; set; } 
     [Column("DESCRIPTION_EVENEMENT")] 
     [Display(Name = "Description: ")] 
     public string Description { get; set; } 
     //[DefaultValue(0)] 
     //[Range(0,1)] 
     [DefaultValue(false)] 
     [Column("IS_CANCELED")] 
     [Display(Name = "Annulation: ")] 
     public bool IsCanceled { get; set; } 
#endregion 
     #region Properties link 
     // Lien Many to Many avec Personne 
     [Column("ID_PERSONNE")] 
     [ForeignKey("IdPersonne")] 
     [Display(Name = "Participants: ")] 
     public virtual ICollection<Personne> Personnes { get; set; } 
     // Lien One to Many avec Lieu 
     // Foreign Key pour Lieu 
     [Column("ID_EVENEMENT_LIEU")] 
     public int IdEvenementLieu { get; set; } 
     [ForeignKey("IdEvenementLieu")] 
     public virtual Lieu lieux { get; set; } 
     // Lien One to Many avec CategorieEvenement 
     // Foreign Key pour Categorie 
     [Column("ID_EVENEMENT_CATEGORIE")] 
     public int IdEvenementCategorie { get; set; } 
     [ForeignKey("IdEvenementCategorie")] 
     public virtual CategorieEvenement categoriesEvenement { get; set; } 
#endregion 
    } 
} 

Мой ViewModel:

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

namespace CTCSAgenda.ViewModels 
{ 
    public class MesEvenementsViewModel 
    { 
     public Personne Personne { get; set; } 
     public virtual ICollection<Evenement> MesEvenements { get; set; } 
    } 
} 

Вот мой контроллер:

public ActionResult MyEvents() 
{ 
    var mesEvenementsViewModel = new MesEvenementsViewModel(); 
    Personne personne = (Personne)Session["User"]; 
    Personne dbPersonne = db.Personnes.Find(personne.IdPersonne); 
    Personne personneVM = db.Personnes.Include(e => e.Evenements).First(e => e.IdPersonne == personne.IdPersonne); 
    mesEvenementsViewModel.Personne = personneVM; 
    mesEvenementsViewModel.MesEvenements = personneVM.Evenements; 
    return View(mesEvenementsViewModel); 
} 

И, наконец, мой взгляд:

@model CTCSAgenda.ViewModels.MesEvenementsViewModel 
@{ 
    ViewBag.Title = "MyEvents"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Les évènements auxquels je suis inscrit: </h2> 

    @Html.DisplayNameFor(model => model.MesEvenements) 
<br /> 


     <table> 
      <tr> 
       @foreach (var item in Model.MesEvenements) 
       { 
        <td>@Html.DisplayFor(model => item.TitreEvenement)</td> 
        <td>@Html.DisplayFor(model => item.DateEvenement)</td> 
        <td>@Html.DisplayFor(model => item.HeureEvenement.TimeOfDay)</td> 
        <td>@Html.DisplayFor(model => item.Description)</td> 
        <td>@Html.DisplayTextFor(model => item.Personnes)</td> 

       } 
      </tr> 
</table> 

Я новичок, так что, вероятно, некоторые ошибки, но все в порядке, за исключением списка Personnes от события. Я получил сообщение с HashSet, и я не знаю, как горячо перечислять мои персонажи ...

+0

Это не вся ошибка. Показать полный текст ошибки и соответствующие исходные строки. – CodeCaster

+0

Вот и все, что я получаю в своем браузере, когда дело доходит до отображения списка Personnes. – Xr4y

+1

Это не ошибка, это неявное выражение 'ToString()' на вашем объекте HashSet. – DavidG

ответ

0

Возможно, ваша коллекция Evenements не была перечислина, когда вы назначили ее виртуальной машине. Выполните следующие действия в контроллере:

mesEvenementsViewModel.MesEvenements = personneVM.Evenements.ToArray()

+0

Я пробовал, но получил тот же результат – Xr4y

+0

Да, это, вероятно, не проблема. Попробуйте добавить атрибут [DisplayName ("...")] в MesEvenements в ViewModel. Я думаю, что вы видите, это не ошибка, а результат DisplayNameFor (m => m.MesEvenements). –

+0

Nop, если я добавляю ' @ Html.DisplayNameFor (model => item.Personnes)' Я получил участников: 'System.Collections.Generic.HashSet'1 [CTCSAgenda.Models.Evenement]' – Xr4y

Смежные вопросы