将数据从视图模型传递到视图

时间:2018-11-11 15:25:31

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

我需要您的帮助。 我在asp.net mvc中创建一个程序。我写了模型类和ViewModel类

public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public int IndexNumber { get; set; }

    public ICollection<Course> Course { get; set; }
}
public class Course
{
    public int CourseId { get; set; }
    public string CoureName { get; set; }
    public int NumberHours { get; set; }
    public bool IsExam { get; set; }

    public ICollection<Student> Student { get; set; }

}
public class ScheduleVM
{
    public string StudentName { get; set; } // Student class
    public int IndexNumber { get; set; }    // Student class
    public string CourseName { get; set; }   // Course class

}

ScheduleVM类在上下文类中不存在,我想创建一个仅返回ScheduleVM类中的数据的视图。我手动编写了Schedule控制器并有一个视图。我不知道如何使用EF和Linq将其中一些数据传输到数据库视图? 如果有人有任何指南,请给我发送链接。

编辑:

从ScheduleVM类查看:

    @model IEnumerable<StudentApp.Models.ScheduleVM>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.StudentName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.IndexNumber)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CoureName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.NameInstructor)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DepartmentName)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.StudentName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.IndexNumber)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CoureName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.NameInstructor)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DepartmentName)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        </td>
    </tr>
}

</table>

当然,因为我没有模型,所以foreach循环不起作用。我生成了视图,但是删除了对上下文类的引用。关于控制器,我不知道如何获取所需的数据。

控制器类:

public class ScheduleController : Controller
{

    // GET: Schedule
    public ActionResult Index()
    {
        List<ScheduleVM> ScheduleVMlist = new List<ScheduleVM>();

        return View();
    }
}

我已经将数据添加到了学生和课程表中,现在我想显示所选的信息,但是我不知道如何从数据库中提取这些数据?

public class ModelContext : DbContext
{
    public ModelContext()
        : base("name=ModelContext")
    {}

    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }

}

1 个答案:

答案 0 :(得分:0)

一种有效的方法是在实体之间组成查询,然后使用.Select()填充相关的视图模型。您可以自己填充视图模型,也可以利用Automapper之类的库来帮助处理更复杂或更大的视图模型。现在,AutoMapper提供了一种ProjectTo扩展方法,可以与EF和IQueryable很好地配合使用。

例如,如果您进行的搜索旨在列出名称以提供的标准开头的课程:

这假设您要根据课程名称获取学生和课程信息。学生拥有“课程”集合,但是课程没有“学生”集合。

using (var context = new MyContext())
{
  var courseIds = context.Courses
    .Where(c => c.CourseName.StartsWith(searchText))
    .ToList();

  var query = context.Students
    .Where(s => s.Courses.Any(c => courseIds.Contains(c.CourseId)));
}

现在,我们有了一个IQueryable,它应该给我们所有拥有至少1门匹配课程的学生。我将课程搜索拆分为仅检索匹配课程ID的列表,因为与将条件嵌入以下查询相比,更容易进行匹配。这些可以组合使用,但是如果您有几个不同的条件,则使用这些条件来标识后续查询的ID可能更容易遵循。

没有对数据库运行任何操作。下一步将是,我们希望将结果展平以列出仅包含匹配课程的学生详细信息。如果我们搜索“ Math”,我们只想返回课程,或者为每个符合该模式的学生提供课程。一个学生可能正在参加“数学100”和“数学200”

using (var context = new MyContext())
{
  var courseIds = context.Courses
    .Where(c => c.CourseName.StartsWith(searchText))
    .ToList();

  var query = context.Students
    .Where(s => s.Courses.Any(c => courseIds.Contains(c.CourseId)));

  var viewModels = query.SelectMany( s => s.Courses.Where(c => courseIds.Contains(c.CourseId))
    .Select(c => new ScheduleVM 
    {
      StudentName = s.StudentName,
      IndexNumber = s.IndexNumber,
      CourseName = c.CourseName
    })).ToList()
}

这可以压缩为一个Linq查询,但是我将其分开以使其更容易覆盖。第一个“查询”检索了具有匹配课程的学生,但此时该学生的课程列表将是该学生正在修读的所有课程。在此示例中,我们只想列出匹配的课程。因此,从Student中,我们执行SelectMany以获取课程详细信息,并使用Where条件仅检索具有匹配ID的课程。从那里,我们对那些匹配的课程进行选择。因为我们仍处于针对该学生的SelectMany范围之内,所以我们仍然可以访问代表当前学生的“ s”。我们“选择”我们的视图模型,并提供“学生”(“ s”)和“课程”(“ c”)中的相关列。最后的ToList实际上将触发SQL运行。 EF将组成一个过滤数据的查询,然后仅返回填充视图模型所需的3列。

希望这为您提供了一些有关如何利用EF填充要提供给视图的数据的想法。我建议即使在不显示ID的情况下,也要在其视图模型中包含ID,因为这对于检索相关学生和/或课程,以便根据这些数据进行任何操作非常有用。