You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC中C#类实现求助:学生工薪资计算项目问题

ASP.NET Core MVC StudentWorker 应用问题排查与修复

问题背景

需开发一个ASP.NET Core MVC Web应用,实现以下功能:

  • 定义Student基类和StudentWorker派生类
  • 接收用户输入的StudentWorker信息(ID、姓名、时薪、工作时长)
  • 计算并输出周薪(时薪×工作时长)
  • 时薪限制在7.25-14.75范围内,工作时长限制在1-15范围内

目前已完成模型、视图和控制器编写,但范围限制逻辑无效,移除限制后仍无法正常工作,对ASP.NET Core MVC框架不熟悉,需排查修复。

现有代码问题分析

  1. 模型层验证逻辑缺失:

    • StudentWorker的属性setter中虽写了范围判断,但ASP.NET Core MVC模型绑定不会自动将该逻辑转化为ModelState错误,导致控制器中ModelState.IsValid始终为true,非法输入只会将属性设为0,无错误提示。
    • 未使用数据注解(DataAnnotations),无法触发前后端自动验证,视图中的asp-validation-for标签无法显示错误信息。
  2. 控制器逻辑未结合验证:

    • 仅依赖ModelState.IsValid判断,但因无数据注解验证,该判断无法识别非法输入,错误输入仍会进入计算逻辑,返回0值周薪,用户无法得知原因。
  3. 视图显示细节问题:

    • 周薪未格式化显示,用户体验差;验证错误提示未生效。

修复步骤与代码修改

1. 模型层添加数据注解验证

引用System.ComponentModel.DataAnnotations命名空间,为属性添加验证规则,同时保留原setter逻辑作为双重验证:

using System.ComponentModel.DataAnnotations;

namespace FinalProject.Models
{
    public class Student
    {
        private int id;
        private string name;

        [Required(ErrorMessage = "Student ID is required")]
        public int ID
        {
            get { return id; }
            set { id = value; }
        }

        [Required(ErrorMessage = "Student name is required")]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public Student(int id, string name)
        {
            this.id = id;
            this.name = name;
        }

        public Student()
        {
            id = 0;
            name = "";
        }

        public override string ToString()
        {
            return ($"ID: {ID}, Name: {Name}");
        }
    }

    public class StudentWorker : Student
    {
        private double hourlyPay;
        private int hoursWorked;

        [Required(ErrorMessage = "Hourly pay is required")]
        [Range(7.25, 14.75, ErrorMessage = "Hourly pay must be between 7.25 and 14.75")]
        public double HourlyPay
        {
            get { return hourlyPay; }
            set
            {
                if (value >= 7.25 && value <= 14.75)
                    hourlyPay = value;
                else
                    hourlyPay = 0;
            }
        }

        [Required(ErrorMessage = "Hours worked is required")]
        [Range(1, 15, ErrorMessage = "Hours worked must be between 1 and 15")]
        public int HoursWorked
        {
            get { return hoursWorked; }
            set
            {
                if (value >= 1 && value <= 15)
                    hoursWorked = value;
                else
                    hoursWorked = 0;
            }
        }

        public StudentWorker(int id, string name, double hourlyPay, int hoursWorked)
                    : base(id, name)
        {
            HourlyPay = hourlyPay;
            HoursWorked = hoursWorked;
        }

        public StudentWorker() : base()
        {
            HourlyPay = 0;
            HoursWorked = 0;
        }

        public double WeeklySalary()
        {
            if (HourlyPay == 0 || HoursWorked == 0)
                return 0;

            return HourlyPay * HoursWorked;
        }

        public override string ToString()
        {
            return ($"ID: {ID}, Name: {Name}, Hourly Pay: {HourlyPay:C}, Hours Worked: {HoursWorked}, Weekly Salary: {WeeklySalary():C}");
        }
    }
}

2. 控制器优化逻辑

控制器核心逻辑无需大幅修改,优化周薪的格式化显示,确保用户看到友好的货币格式:

using FinalProject.Models;
using Microsoft.AspNetCore.Mvc;

namespace FinalProject.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Index(StudentWorker model)
        {
            if (ModelState.IsValid)
            {
                var weeklySalary = model.WeeklySalary();
                // 格式化周薪为货币格式
                ViewBag.WeeklySalary = weeklySalary.ToString("C");
                return View(model);
            }

            return View(model);
        }
    }
}

3. 视图优化验证与显示

确保验证错误正常显示,同时周薪显示更友好:

@model FinalProject.Models.StudentWorker

@{
    ViewBag.Title = "Create Student Worker";
}
<html>
<head>
    <title>Student Worker</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>

<h2>Create Student Worker</h2>

<form asp-action="Index" method="post">
    <div class="form-group">
        <label asp-for="ID" class="control-label">Student ID</label>
        <input asp-for="ID" class="form-control" />
        <span asp-validation-for="ID" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Name" class="control-label">Student Name</label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="HourlyPay" class="control-label">Hourly Pay</label>
        <input asp-for="HourlyPay" class="form-control" />
        <span asp-validation-for="HourlyPay" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="HoursWorked" class="control-label">Hours Worked</label>
        <input asp-for="HoursWorked" class="form-control" />
        <span asp-validation-for="HoursWorked" class="text-danger"></span>
    </div>
    <button type="submit" class="btn btn-primary">Calculate Weekly Salary</button>
</form>

@if (ViewBag.WeeklySalary != null)
{
    <h3 class="mt-4">Weekly Salary: @ViewBag.WeeklySalary</h3>
}

</body>
</html>

修复说明

  • 数据注解会在模型绑定时自动验证输入,不符合规则时ModelState.IsValid变为false,控制器返回视图并显示错误信息。
  • 前端通过asp-validation-for标签自动显示验证错误,提升用户体验。
  • 周薪格式化后以货币形式显示,更符合需求。

内容的提问来源于stack exchange,提问作者Nedmac624

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:59:49