【问题标题】:Displaying Viewmodel in View在视图中显示视图模型
【发布时间】:2020-04-23 16:04:58
【问题描述】:

所以我有一个名为 Reports 的视图模型类,它看起来像这样:

    public class MemberReports
    {
        public Member Members { get; set; }
        public Event Events { get; set; }
        public MemberClubHours Memberclubhours { get; set; }
        public VolunteerEvents Volunteerevents { get; set; }
    }

它包含与活动、MemberClubHours 和志愿者活动有多对多关系的成员。基本上我想在一个名为报告的视图中显示我对成员的所有数据。但是我很难做到这一点,有什么建议吗? 以下是所有课程:

    public class Member
    {
        public int Id { get; set; }
        [Required]
        [MaxLength(4, ErrorMessage = "PIN must be 4 numbers long"), MinLength(4, ErrorMessage = "PIN must be 4 numbers long")]
        public string PIN { get; set; }
        [Required]
        [Display(Name ="First Name")]
        public string FirstName { get; set; }
        [Required]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        [Display(Name = "Date of Birth")]
        public DateTime? Birthdate { get; set; }
        public virtual ICollection<Event> Events { get; set; }
        public virtual ICollection<VolunteerEvents> Vevents { get; set; }
        public virtual ICollection<MemberClubHours> Hours { get; } = new HashSet<MemberClubHours>();
    }
public class Event
{

    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    [Display(Name = "Date")]
    public DateTime? EventDate { get; set; }
    [Required]
    [Display(Name = "Start Time")]
    public TimeSpan EventStartTime { get; set; }
    [Required]
    [Display(Name = "End Time")]
    public TimeSpan EventEndTime { get; set; }
    public int EventTotalTime{ get; set; }
    public virtual ICollection<Member> Members { get; set; }


}

    public class MemberClubHours
    {
        public int Id { get; set; }
        public DateTime? ClockIn { get; set; }
        public DateTime? ClockOut { get; set; }
        [Required]
        public Member Member { get; set; }
    }
public class VolunteerEvents
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    [Display( Name ="Date")]
    public DateTime? VEventDate { get; set; }
    [Required]
    [Display(Name = "Start Time")]
    public TimeSpan VEventStartTime { get; set; }
    [Required]
    [Display(Name = "End Time")]
    public TimeSpan VEventEndTime { get; set; }
    public int VEventTotalTime { get; set; }
    public virtual ICollection<Member> Members { get; set; }
}

这是控制器,我有点困惑,我应该遍历类以获取要存储在视图模型中的信息吗?

         public ActionResult Reports()//reports page
        {
            var Data = new MemberReports()
            {


            };

            return View(Data);
        }

最后是这里的视图:


@model IEnumerable<ClubChallenge.ViewModels.MemberReports>
@{

                ViewBag.Title = "Reports";
}

<table>

    @foreach (var data in Model)
    {
        <tr>
            <td></td>
        </tr>
    }




</table>

【问题讨论】:

  • 您会在问题中包含成员、活动、MemberClubHours、VolunteerEvents 类和属性吗?还包括有关如何创建视图模型的控制器代码。谢谢。
  • 好的,我加了

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

看起来在所有这些导航属性中,您分配了virtual 关键字。实体框架中的virtual关键字表示该相关实体将被延迟加载或自动加载,无需查询。

public class Member
{
    ...
    public virtual ICollection<Event> Events { get; set; }
    public virtual ICollection<VolunteerEvents> Vevents { get; set; }
    public virtual ICollection<MemberClubHours> Hours { get; } = new HashSet<MemberClubHours>();
}

毕竟您可能不需要 MemberReports,因为导航属性会自动加载,您只需搜索成员并将其返回到视图即可。试试这个;

public ActionResult Reports()
{
   // If your navigation properties doesn't have the virtual keyword, you need to write your query like this;
   // var member = context.Members.Include(m=>m.Events).Include(m=>m.Vevents).Include(m=>m.Hours).ToList();

   // but since, you put virtual, you could just do this;
   // all the other navigation properties are automatically loaded
   var members = context.Members.ToList();

   // you could immediately access them like this

   // get the first member
   Console.WriteLine(members.FirstOrDefault().Events.Count);
   Console.WriteLine(members.FirstOrDefault().Events.FirstOrDefault().Name);

   Console.WriteLine(members.FirstOrDefault().Vevents.Count);
   Console.WriteLine(members.FirstOrDefault().Vevents.FirstOrDefault().Name);

   Console.WriteLine(members.FirstOrDefault().Hours.Count);
   Console.WriteLine(members.FirstOrDefault().Hours.ClockIn.ToString());

   return View(member);
}

那么在你看来,你可以做一个嵌套循环。首先循环遍历成员,然后在内部循环遍历导航属性;

@model IEnumerable<ClubChallenge.Members>
@{
    ViewBag.Title = "Reports";
}

<table>

    @foreach (var data in Model)
    {
        <tr>
            <td>
               @foreach(var event in data.Events){
                  <text>@event.Name ,</text>
               }
            </td>
            <td>
               @foreach(var vevent in data.Vevents){
                  <text>@vevent.Name ,</text>
               }
            </td>
            <td>
               @foreach(var hour in data.Hours){
                  <text>@hour.ClockIn.ToString() ,</text>
               }
            </td>
        </tr>
    }
</table>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多