Отображение Viewmodel в представлении - PullRequest
1 голос
/ 23 апреля 2020

Итак, у меня есть класс модели представления, называемый «Отчеты», который выглядит следующим образом:

    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>

1 Ответ

1 голос
/ 23 апреля 2020

Похоже, что во всех этих свойствах навигации вы назначили ключевое слово 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);
}

Тогда, по вашему мнению, вы можете сделать вложенный l oop. Сначала l oop через элемент, затем внутри l oop через свойства навигации;

@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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...