📜  asp.net mvc 从多对多关系中选择 - C# (1)

📅  最后修改于: 2023-12-03 14:39:22.435000             🧑  作者: Mango

ASP.NET MVC 从多对多关系中选择 - C#

在ASP.NET MVC应用程序中,通常需要从多对多关系中选择一个或多个实例。在本教程中,我们将学习如何使用C#编程在ASP.NET MVC中从多对多关系中选择实例。

环境
  • Visual Studio 2019
  • .NET Framework 4.7.2或更高版本
  • Entity Framework 6或更高版本
  • SQL Server数据库
实现
步骤1:建立数据库

首先,我们需要创建一个包含多对多关系的数据库。下面是一个示例数据库模式,包含学生和课程之间的多对多关系。

CREATE TABLE Students (
    StudentID int PRIMARY KEY,
    StudentName varchar(50)
);

CREATE TABLE Courses (
    CourseID int PRIMARY KEY,
    CourseName varchar(50)
);

CREATE TABLE StudentCourses (
    StudentID int,
    CourseID int,
    CONSTRAINT PK_StudentCourses PRIMARY KEY (StudentID, CourseID),
    CONSTRAINT FK_StudentCourses_Students FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
    CONSTRAINT FK_StudentCourses_Courses FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);

我们将使用Entity Framework Code First方法自动生成此数据库。要做到这一点,请创建一个ASP.NET MVC Web应用程序并将其命名为“MultiSelectDemo”。

步骤2:添加实体模型

我们需要定义与数据库表对应的实体模型。打开Solution Explorer,并在项目上右键单击,然后选择“添加”>“类”。

在打开的窗口中,输入以下代码:

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    public int CourseID { get; set; }
    public string CourseName { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

在这里,我们定义了两个实体模型:Student和Course。他们映射到了我们在第一步中创建的数据库表。

在Student模型中,我们使用虚拟ICollection属性表示这个学生所选择的所有课程。在Course模型中,我们使用虚拟ICollection属性表示选择该课程的所有学生。

步骤3:添加DbContext

接下来,我们需要添加一个DbContext类,用于管理与数据库的交互。右键单击项目,选择“添加”>“新建项”,并选择“ADO.NET实体数据模型”。在模型名称字段中输入“MultiSelectContext”,然后点击“添加”。

在打开的窗口中,选择“Code First from database”,然后选择先前创建的数据库连接。接受默认值,然后选择将Student和Course表作为实体添加到生成的上下文中。

以下是生成的DbContext类代码:

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

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
            .HasMany<Course>(s => s.Courses)
            .WithMany(c => c.Students)
            .Map(cs =>
            {
                cs.MapLeftKey("StudentID");
                cs.MapRightKey("CourseID");
                cs.ToTable("StudentCourses");
            });
    }
}

我们在DbContext类中定义了两个DbSet属性,用于访问学生和课程表。我们使用OnModelCreating方法定义了学生与课程之间的多对多关系。

步骤4:创建控制器和视图

现在我们可以创建控制器和视图来显示学生和课程之间的多对多关系。打开Solution Explorer并右键单击Controllers文件夹,然后选择“添加”>“控制器”。命名控制器为“StudentController”。

接下来,我们将添加一个简单的Index视图,在该视图中,我们将为每个学生显示复选框列表,以供选择所选课程。

在StudentController中添加以下代码:

public class StudentController : Controller
{
    MultiSelectContext db = new MultiSelectContext();

    public ActionResult Index()
    {
        var students = db.Students.Include(s => s.Courses).ToList();
        return View(students);
    }
}

在这里,我们将MultiSelectContext实例化为db对象,并获取所有学生及其所选课程的列表,将其传递给视图。

接下来,我们将添加Index视图。右键单击StudentController文件夹,然后选择“添加”>“视图”。在名称字段中输入“Index”,并选择模板中的List,模型类中选择Student *。

在Index视图文件中添加以下代码:

@model List<Student>

<h2>Students</h2>

<table>
    <thead>
        <tr>
            <th></th>
            <th>Student Name</th>
            <th>Course Names</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var student in Model)
        {
            <tr>
                <td>@Html.CheckBox("studentIds", new { value = student.StudentID })</td>
                <td>@student.StudentName</td>
                <td>@string.Join(", ", student.Courses.Select(x => x.CourseName))</td>
            </tr>
        }
    </tbody>
</table>

在这里,我们显示了包含每个学生的复选框列表,以供选择所选课程。我们还显示了每个学生的名称和所选课程的名称列表。

步骤5:处理用户选择

最后,我们需要处理用户的选择并将所选课程保存到数据库中。

在StudentController中添加以下代码:

[HttpPost]
public ActionResult Index(List<int> studentIds, int[] courses)
{
    foreach (int studentId in studentIds)
    {
        var student = db.Students.Include(s => s.Courses).Where(s => s.StudentID == studentId).FirstOrDefault();

        student.Courses.Clear();

        if (courses != null)
        {
            foreach (int courseId in courses)
            {
                var course = db.Courses.Find(courseId);
                student.Courses.Add(course);
            }
        }

        db.SaveChanges();
    }

    return RedirectToAction("Index");
}

我们使用[HttpPost]特性标记Post方法,并将选定的学生ID列表和课程ID数组作为参数。然后,我们遍历每个学生,找到与所选ID相匹配的学生并清除他们先前选择的所有课程。

然后,我们检查用户是否选择了任何课程,并遍历课程ID数组以获取每个所选课程。然后,我们将每个所选课程添加到当前学生的课程列表中,并保存更改到数据库中。

结论

在本教程中,我们学习如何在ASP.NET MVC应用程序中从多对多关系中选择实例。我们使用C#编写了代码示例,并演示了如何创建实体模型,添加DbContext和创建控制器和视图以处理用户的选择。