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

ASP.NET Core MVC教师管理系统员工号格式验证异常求助

问题原因解释

你当前代码的核心问题是调用Substring(1)的时机错误:
当用户输入空字符串(长度为0)或仅输入"T"(长度为1)时,Substring(1)会尝试从索引1的位置截取字符,但此时字符串的长度不足以支持这个操作,直接触发了ArgumentOutOfRangeException。同时你用||(逻辑或)连接条件,意味着即使前面的空值判断为真,后面的StartsWith和Regex.IsMatch仍会执行,这就导致了异常触发。


修复方案

方案1:修复控制器中的验证代码

调整判断顺序,避免在字符串长度不足时调用Substring,或者直接用一个完整的正则表达式匹配整个字符串(更简洁):

// 用完整正则匹配,一步到位验证格式
var employeeNumberPattern = @"^T\d+$";
if (string.IsNullOrEmpty(NewTeacher.TeacherEmployeeNumber) || 
    !System.Text.RegularExpressions.Regex.IsMatch(NewTeacher.TeacherEmployeeNumber, employeeNumberPattern))
{
    ModelState.AddModelError("TeacherEmployeeNumber", "Employee number must start with 'T' followed by digits");
    isValid = false;
}

正则^T\d+$的简单解释:

  • ^:匹配字符串开头
  • T:必须以大写字母T开头(要支持小写可改成[Tt])
  • \d+:后面必须跟至少一个数字(\d代表数字,+表示至少出现一次)
  • $:匹配字符串结尾
    这个正则会直接排除空字符串、仅"T"、T后跟非数字的所有无效情况。

方案2:ASP.NET Core 推荐的模型验证(更规范)

既然你已经在模型中使用了[Required],直接在模型上添加格式验证属性,让框架自动处理验证逻辑,无需在控制器中写额外判断:

修改Teacher模型:

public class Teacher
{
    public int TeacherId { get; set; }
    
    [Required(ErrorMessage = "Teacher Employee Number is required")]
    [RegularExpression(@"^T\d+$", ErrorMessage = "Employee number must start with 'T' followed by digits")]
    public string TeacherEmployeeNumber { get; set; }
    
    [Required(ErrorMessage = "Teacher First Name is required")]
    public string TeacherFName { get; set; }
    
    // other properties...
}

然后在控制器中只需检查ModelState.IsValid即可:

public IActionResult Create(Teacher NewTeacher)
{
    if (!ModelState.IsValid)
    {
        // 返回表单页面,自动显示错误信息
        return View(NewTeacher);
    }
    // 验证通过,执行保存等逻辑
    return RedirectToAction("Index");
}

框架会自动按顺序验证:

  1. 先检查是否为空([Required]),空则显示对应错误
  2. 再检查格式是否符合正则,不符合则显示格式错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:53:13