基于 .NET 框架开发的考试系统网络版通常由以下几个主要部分构成:

  1. 前端界面(用户交互界面)
  2. 后端逻辑(服务器端处理)
  3. 数据库(存储考试题目、用户信息等)

我们将通过一个 简单的在线考试系统 来说明各个部分的实现。这里的实现将分为 ASP.NET Core MVC(前端 + 后端),SQL Server(数据库),并详细讲解源代码中的核心部分。

项目结构

  1. 前端部分:使用 ASP.NET Core MVC,前端通常是 HTML、CSS、JavaScript 来完成用户界面交互。
  2. 后端部分:用 C# 编写逻辑处理,如题库管理、用户答题、成绩统计等。
  3. 数据库:用 SQL Server 存储题目、用户信息、考试记录和成绩等。

1. 数据库设计

首先,设计数据库来存储考试数据。假设我们有以下数据表:

Tables:

  • Users(用户表)
    • UserId (int, primary key)
    • Username (nvarchar(100))
    • Password (nvarchar(100))
    • Role (nvarchar(50)) // “Admin” or “Student”
  • Questions(题目表)
    • QuestionId (int, primary key)
    • QuestionText (nvarchar(255))
    • OptionA (nvarchar(100))
    • OptionB (nvarchar(100))
    • OptionC (nvarchar(100))
    • OptionD (nvarchar(100))
    • CorrectOption (char) // A, B, C, or D
  • Exams(考试记录表)
    • ExamId (int, primary key)
    • UserId (int, foreign key referencing Users)
    • StartTime (datetime)
    • EndTime (datetime)
  • Answers(学生答题表)
    • AnswerId (int, primary key)
    • ExamId (int, foreign key referencing Exams)
    • QuestionId (int, foreign key referencing Questions)
    • SelectedOption (char)

2. 后端代码

2.1. 用户登录与身份验证

在 ASP.NET Core 中,可以使用 Identity 系统来管理用户的登录和身份验证。

// Controllers/AccountController.cs
public class AccountController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    // 登录页面
    [HttpGet]
    public IActionResult Login()
    {
        return View();
    }

    // 处理登录请求
    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = await _userManager.FindByNameAsync(model.Username);
            if (user != null)
            {
                var result = await _signInManager.PasswordSignInAsync(user, model.Password, model.RememberMe, false);
                if (result.Succeeded)
                {
                    return RedirectToAction("Index", "Home");
                }
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            }
            else
            {
                ModelState.AddModelError(string.Empty, "User not found.");
            }
        }
        return View(model);
    }
}

代码解释

  • 使用 UserManager 和 SignInManager 管理用户身份验证。
  • Login 方法接收用户名和密码进行验证,成功后跳转到主页。

2.2. 获取考试题目

// Controllers/ExamController.cs
public class ExamController : Controller
{
    private readonly ApplicationDbContext _context;

    public ExamController(ApplicationDbContext context)
    {
        _context = context;
    }

    // 获取考试题目
    public IActionResult StartExam()
    {
        var questions = _context.Questions.ToList();
        return View(questions);
    }

    // 处理用户提交的答案
    [HttpPost]
    public IActionResult SubmitExam(int[] selectedOptions)
    {
        // 假设 selectedOptions 是题目的 ID 和选项的数组
        var score = 0;
        for (int i = 0; i < selectedOptions.Length; i++)
        {
            var correctAnswer = _context.Questions.Find(i).CorrectOption;
            if (selectedOptions[i] == correctAnswer)
            {
                score++;
            }
        }

        // 记录考试成绩
        var userId = User.Identity.Name;
        _context.Exams.Add(new Exam { UserId = userId, StartTime = DateTime.Now, EndTime = DateTime.Now, Score = score });
        _context.SaveChanges();

        return View("ExamResult", score);
    }
}

代码解释

  • 在 StartExam 方法中,系统从数据库中获取所有的题目,并显示给学生。
  • SubmitExam 方法接收学生的选项并与正确答案进行比对,最后返回考试成绩。

2.3. 处理考试答题

在前端,使用 HTML 表单 和 JavaScript 收集学生的答案,并提交给后端。

<!-- Views/Exam/StartExam.cshtml -->
@foreach (var question in Model)
{
    <div>
        <p>@question.QuestionText</p>
        <label>
            <input type="radio" name="selectedOptions[@question.QuestionId]" value="A"> @question.OptionA
        </label>
        <label>
            <input type="radio" name="selectedOptions[@question.QuestionId]" value="B"> @question.OptionB
        </label>
        <label>
            <input type="radio" name="selectedOptions[@question.QuestionId]" value="C"> @question.OptionC
        </label>
        <label>
            <input type="radio" name="selectedOptions[@question.QuestionId]" value="D"> @question.OptionD
        </label>
    </div>
}

<form method="post" action="/Exam/SubmitExam">
    <button type="submit">Submit Exam</button>
</form>

代码解释

  • 在 HTML 表单中,每个题目都展示为一个问题和四个选择,学生选择一个答案后通过 POST 提交答案。

3. 前端部分

3.1. 首页与考试页面

主页展示欢迎信息以及登录选项,登录后进入考试界面。

<!-- Views/Home/Index.cshtml -->
@{
    if (User.Identity.IsAuthenticated)
    {
        <h1>Welcome @User.Identity.Name</h1>
        <a href="/Exam/StartExam">Start Exam</a>
    }
    else
    {
        <a href="/Account/Login">Login</a>
    }
}

3.2. 结果页面

<!-- Views/Exam/ExamResult.cshtml -->
<h2>Your score: @Model</h2>
<a href="/">Back to Home</a>

代码解释

  • ExamResult.cshtml 展示学生的考试成绩。

4. 数据库操作(EF Core)

我们使用 Entity Framework Core 来操作数据库。

// ApplicationDbContext.cs
public class ApplicationDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Question> Questions { get; set; }
    public DbSet<Exam> Exams { get; set; }
    public DbSet<Answer> Answers { get; set; }
}

4.1. 数据模型

public class User
{
    public int UserId { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Role { get; set; }
}

public class Question
{
    public int QuestionId { get; set; }
    public string QuestionText { get; set; }
    public string OptionA { get; set; }
    public string OptionB { get; set; }
    public string OptionC { get; set; }
    public string OptionD { get; set; }
    public string CorrectOption { get; set; }
}

public class Exam
{
    public int ExamId { get; set; }
    public int UserId { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public int Score { get; set; }
}

5. 总结

这个基于 .NET Core MVC 的考试系统包含了以下几个核心功能:

  • 用户登录和身份验证
  • 获取考试题目并展示
  • 学生选择答案并提交
  • 计算成绩并记录考试信息
  • 使用 Entity Framework Core 进行数据库操作

通过这种结构,用户可以登录、参加考试并查看成绩,管理员可以在后台管理题库和查看成绩。这是一个完整的基础版 **

考试系统**,你可以根据需求进一步扩展功能,如增加计时、随机题目、详细成绩统计等。