基于CourtType自动生成带条件前缀的TCaseNo并修复序号递增问题
解决方案
1. 后端实现序号查询与递增逻辑
序号的维护必须放在后端,确保F、M类各自独立的年度序列仅在表单提交成功后才递增:
- 新增接口用于查询下一个可用序号(仅查询不更新,避免前端切换选项时误递增)
- 表单提交成功后,更新对应类型和年份的序号记录(可通过专门的序号表存储
类型、年份、当前最大序号)
示例后端C#代码:
// 获取下一个可用的案件序号(仅查询,不修改数据库) public JsonResult GetNextCaseNumber(string type) { var currentYear = DateTime.Now.Year % 100; // 取年份后两位 // 从数据库查询对应类型+年份的当前最大序号,无记录则默认0 var lastSeq = _db.CaseNumberSequences .FirstOrDefault(s => s.Type == type && s.Year == currentYear)? .CurrentMaxNo ?? 0; var nextSeq = lastSeq + 1; return Json(new { Prefix = $"T{type}-", Seq = nextSeq.ToString("D3"), // 补零为3位 Year = currentYear.ToString() }); } // 提交表单后更新序号 [HttpPost] public IActionResult Create(InvestigationLog model) { if (ModelState.IsValid) { // 保存案件记录 _db.InvestigationLogs.Add(model); // 更新对应类型的序号 var typeCode = model.CourtType.Contains("(F)") ? "F" : "M"; var currentYear = DateTime.Now.Year % 100; var sequence = _db.CaseNumberSequences .FirstOrDefault(s => s.Type == typeCode && s.Year == currentYear); if (sequence != null) { sequence.CurrentMaxNo += 1; } else { _db.CaseNumberSequences.Add(new CaseNumberSequence { Type = typeCode, Year = currentYear, CurrentMaxNo = 1 }); } _db.SaveChanges(); return RedirectToAction("Index"); } return View(model); }
2. 前端JavaScript修正
前端仅负责选择类型时调用后端接口获取编号,不做本地递增,同时缓存当前类型的编号信息避免重复请求:
// 缓存当前选中类型的编号信息 let currentCaseCache = null; function assignCaseNo() { const courtType = document.getElementById("SelectCourtType").value; const caseNoInput = document.getElementById("TCaseNumber"); // 非目标类型时清空输入框 if (!courtType || (!courtType.includes("Transfer In (F)") && !courtType.includes("Transfer In (M)"))) { caseNoInput.value = ""; currentCaseCache = null; return; } const typeCode = courtType.includes("(F)") ? "F" : "M"; // 已缓存当前类型的编号,直接复用 if (currentCaseCache && currentCaseCache.type === typeCode) { caseNoInput.value = `${currentCaseCache.prefix}${currentCaseCache.seq}-${currentCaseCache.year}`; return; } // 调用后端接口获取编号 fetch(`/YourControllerName/GetNextCaseNumber?type=${typeCode}`) .then(res => res.json()) .then(data => { const caseNumber = `${data.Prefix}${data.Seq}-${data.Year}`; caseNoInput.value = caseNumber; currentCaseCache = { type: typeCode, prefix: data.Prefix, seq: data.Seq, year: data.Year }; }) .catch(err => console.error("生成案件编号失败:", err)); } // 表单提交前校验编号是否已生成 document.querySelector("form").addEventListener("submit", function(e) { if (!document.getElementById("TCaseNumber").value) { e.preventDefault(); alert("请先选择案件类型生成编号"); } });
3. 视图(cshtml)调整
确保下拉框事件绑定正确,移除前端本地递增的冗余逻辑:
<td style="width: 25%"> <div class="mb-3"> <label asp-for="InvestigationLog.TCaseNo"></label> <input asp-for="InvestigationLog.TCaseNo" id="TCaseNumber" type="text" class="form-control" readonly="readonly" /> </div> </td> <td style="width: 25%"> <div class="mb-3"> <label asp-for="InvestigationLog.CourtType"></label> <select asp-for="InvestigationLog.CourtType" id="SelectCourtType" class="form-select" asp-items="@(new SelectList(Model.DisplayCourtTypeData.OrderBy(x => x.CourtTypeDesc),"CourtTypeDesc", "CourtTypeDesc"))" onchange="assignCaseNo()"> <option value="" selected disabled>---Select Court Type---</option> </select> </div> </td>
核心逻辑说明
- 序号的生成与更新完全由后端控制,避免前端切换选项时的误递增问题
- 前端通过缓存机制减少重复请求,提升体验
- 仅在表单提交成功后才更新序号,确保序列的唯一性与准确性
内容的提问来源于stack exchange,提问作者MelB
相关产品推荐
相关产品推荐

