【问题标题】:ICollection in a view ASP.NETASP.NET 视图中的 ICollection
【发布时间】:2016-01-19 03:53:57
【问题描述】:

我得到了错误:

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

当我尝试在视图中列出我的 Icollection 时的消息。

这是我的模范人物:

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

我的模特晚会:

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

我的视图模型:

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>

我是初学者,所以可能会有一些错误,但一切都很好,除了来自事件的人员列表。我收到了 HashSet 的消息,但我不知道列出我的 Personnes 的热度...

【问题讨论】:

  • 这还不是全部错误。显示完整的错误文本和相关的源代码行。
  • 这就是我在浏览器上显示人员列表的全部内容。
  • 这不是错误,是视图隐式调用了您的 HashSet 对象上的ToString()
  • 在您显示的代码中没有打印 HashSet 的代码。
  • @CodeCaster 但是有ICollection可以存储HashSet

标签: c# asp.net-mvc mvvm


【解决方案1】:

您的 Evenements 集合可能在您将其分配给 VM 时未被枚举。 在控制器中尝试以下操作:

mesEvenementsViewModel.MesEvenements = personneVM.Evenements.ToArray()

【讨论】:

  • 是的,这可能不是问题所在。尝试将 [DisplayName("...")] 属性添加到 ViewModel 中的 MesEvenements。我认为您看到的不是错误,而是 DisplayNameFor(m => m.MesEvenements) 的结果。
  • 没有如果我添加&lt;td&gt;@Html.DisplayNameFor(model =&gt; item.Personnes)&lt;/td&gt; 我得到了参与者:System.Collections.Generic.HashSet1[CTCSAgenda.Models.Evenement]`
  • System.Collections.Generic.HashSet`1[CTCSAgenda.Models.Evenement] 不是您最初收到的消息吗?发生这种情况是因为您仅在实体模型中定义 [Display] 属性,而不是在视图模型中。
  • 更清楚地说,我的假设是您看到的“System.Collections.Generic.HashSet`1[CTCSAgenda.Models.Evenement]”消息不是错误,而是 Razor 打印类型您尝试使用 DisplayNameFor() 或 DisplayFor() 访问的属性的名称。确保在使用 DisplayNameFor() 时属性上有 [DisplayName()] 属性。当您调用 DisplayFor() 时,您还需要一个与属性类型匹配的显示模板(在 Views\Shared\DisplayTemplates 下)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多