Как я могу показать данные из одной ViewModel в другом View (таблица)? - PullRequest
0 голосов
/ 09 февраля 2020

Я создал таблицу, в которой я хотел бы показать данные, которые я создал в другой ViewModel. Причина, по которой я создал эти данные в ViewModel, заключается в том, что у меня недостаточно знаний, чтобы объединить все эти данные в одной таблице. Я буду писать только части своего кода, потому что его слишком много:

public class Student
{
    [Key]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; } 
    public string Address { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
    public string Status { get; set; }
    public int IdCourse { get; set; }
    public Course Course { get; set; }
}


public class Course
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
    public DateTime Date { get; set; }
    public int NumberOfStudents { get; set; }
    public ICollection<Student> Student { get; set; }
}


    public ActionResult Index()
    {
        return View(db.Students.Include(b => b.Course).ToList());
    }


@using StudentCourse.Models
@model List<Student>
       <table>
            <tr>
                <th>Title</th>
                <th>NumberOfStudents</th>   
                 <th>Description</th>
                <th>Price</th>
                <th>Date</th>

            </tr>
            @foreach (var item in Model)
            {
        <tr>
            <td>@item.Course.Title<td>
            <td>@item.Course.NumberOfStudents</td>
            <td>@item.Course.Description</td>
            <td>@item.Course.Price</td>
            <td>@item.Course.Date</td>
        </tr>
            }
        </table>

Когда студент выбирает определенный курс, я должен одобрить или отклонить его / ее заявку (свойство Status):

        @Html.RadioButtonFor(b => b.Status, "Accepted", false) Accepted
        @Html.RadioButtonFor(b => b.Status, "Rejected", true) Rejected

Число утвержденных приложений должно отображаться с автоматическим приращением в:

<td>@item.Course.NumberOfStudents</td>

Однако я не могу этого сделать, но мне удалось получить данные в ViewModel с помощью IQueriable / Key / Количество:

ViewModel:

public class StudentCourseGroup
{
    public string Title { get; set; }

    public int NumberOfStudents { get; set; }
}


public ActionResult Grouping()
    {
    IQueryable<StudentCourseGroup> grouping = from student in db.Students.Include(d => 
d.Course).Where(d => d.Status == "Accepted")
group student by student.Curse.Title into courseGroup
select new StudentCourseGroup()
{
Title = courseGroup.Key,           
NumberOfStudents = courseGroup.Count()
                                               };
return View(data.ToList());
    }

Данные показаны в этой таблице, все работает:

@model IEnumerable<StudentCourse.ViewModels.StudentCourseGroup>

<table>
<tr>
    <th>
        Title
    </th>

    <th>
        Title
    </th>
</tr>

@foreach (var item in Model)
{
<tr>
<td>
    @Html.DisplayFor(modelItem => item.Title)
</td>

<td>
    @item.NumberOfStudents
</td>
</tr>
}
</table>

Но я хочу, чтобы NumberOfStudents отображался в соединении большой стол, о котором я упоминал в начале:

       <td>@item.Course.Title<td>
       <td>@item.Course.NumberOfStudents</td> 
       <td>@item.Course.Description</td>

1 Ответ

0 голосов
/ 10 февраля 2020

Ты очень близко! Прежде чем я отвечу, я думаю, что ваша структура данных имеет отношение 1 ко многим между курсом и студентом Вероятно, между студентом и курсом должно быть либо много ко многим, либо 1 ко многим (много курсов для одного студента. В классе учеников должен быть набор курсов, к которым принадлежит студент). Поскольку структура данных стоит, вам придется изменить db.Students.Include(b => b.Course).ToList() на

db.Students
                  .Include(b => b.Course)
                  .Select(b => new StudentDTO()
                  {
                      Id = b.Id,
                      FirstName = b.FirstName,
                      Course = db.Courses
                               .Where(c => c.Id == b.Course.Id)
                               .Select(c => new CourseDTO()
                               {
                                   Id = c.Id,
                                   Title = c.Title,
                                   NumberOfStudents = c.Student.Count()
                               })
                               .FirstOrDefault()
                  }).ToList();

public class StudentDTO
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
    public string Status { get; set; }
    public int IdCourse { get; set; }
    public CourseDTO Course { get; set; }
}

public class CourseDTO
{
    public int Id { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
    public DateTime Date { get; set; }
    public int NumberOfStudents { get; set; }
    public List<StudentDTO> Student { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...