因此,我有一个名为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; }
}
这是控制器,我有点困惑,我是否应该遍历这些类以获取要存储在viewmodel中的信息?
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>
答案 0 :(得分: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>