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"); }
框架会自动按顺序验证:
- 先检查是否为空(
[Required]),空则显示对应错误 - 再检查格式是否符合正则,不符合则显示格式错误
内容的提问来源于stack exchange,提问作者Anna Charbadze
相关产品推荐
相关产品推荐

