Blazor服务端(.NET 6)实现数字录入重复条目校验的方案咨询
Blazor服务端(.NET 6)实现数字录入重复条目校验的方案咨询
嗨,我来帮你搞定这个重复数字校验的问题!你现在已经有了入库的基础功能,核心就是要从前端体验优化和后端数据安全两方面入手,确保不会出现重复条目,我给你梳理几个可行的方案:
一、前端即时校验(提升用户体验)
可以在用户输入数字的过程中,实时查询数据库判断是否已存在,立刻给出提示。修改你的Razor页面代码:
<EditForm Model="@veh" OnValidSubmit="SaveNumber"> <DataAnnotationsValidator /> <div class="mb-3"> <label for="number" class="form-label">Number</label> <div class="col-md-4"> <InputText class="form-control" @bind-Value="veh.Number" @onchange="CheckDuplicateNumber" placeholder="请输入1-7位数字" /> <!-- 显示重复错误提示 --> <ValidationMessage For="@(() => veh.Number)" /> </div> </div> <button type="submit" class="btn btn-primary">提交</button> </EditForm>
然后在你的AddNumberModel类里添加校验逻辑:
// 假设你有封装好的数据访问服务,比如INumberService private readonly INumberService _numberService; private string _duplicateErrorMessage; // 通过构造函数注入服务 public AddNumberModel(INumberService numberService) { _numberService = numberService; } // 实时校验重复的方法 private async Task CheckDuplicateNumber(ChangeEventArgs e) { var inputNumber = e.Value?.ToString().Trim(); if (!string.IsNullOrEmpty(inputNumber)) { // 调用服务查询数据库是否存在该数字 var isDuplicate = await _numberService.IsNumberExistsAsync(inputNumber); if (isDuplicate) { _duplicateErrorMessage = "这个数字已经存在啦,请换一个!"; } else { _duplicateErrorMessage = null; } // 通知验证状态更新,让错误提示显示/消失 EditContext?.NotifyValidationStateChanged(); } } // 你的数字模型类,加上基础校验规则 public class VehicleNumberModel { [Required(ErrorMessage = "请输入数字")] [StringLength(7, MinimumLength = 1, ErrorMessage = "数字长度必须在1-7位之间")] public string Number { get; set; } } // 重写模型验证,把重复校验加入进去 public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { foreach (var result in base.Validate(validationContext)) { yield return result; } if (!string.IsNullOrEmpty(_duplicateErrorMessage)) { yield return new ValidationResult(_duplicateErrorMessage, new[] { nameof(veh.Number) }); } }
二、后端双重校验(保障数据安全)
前端校验只是提升体验,不能完全依赖(比如有人绕过前端直接调用接口),所以必须在入库前再做一次校验:
public async Task SaveNumber() { if (!ModelState.IsValid) { return; } // 再次校验数字是否存在 var isDuplicate = await _numberService.IsNumberExistsAsync(veh.Number.Trim()); if (isDuplicate) { ModelState.AddModelError(nameof(veh.Number), "该数字已存在,请重新输入!"); return; } // 执行你的入库逻辑 try { await _numberService.AddNumberAsync(veh); // 入库成功后跳转到列表页 NavigationManager.NavigateTo("/list"); } catch (DbUpdateException ex) { // 额外加一层数据库唯一约束的异常捕获(兜底) if (ex.InnerException is SqlException sqlEx && sqlEx.Number == 2601) // SQL Server的唯一约束冲突错误码 { ModelState.AddModelError(nameof(veh.Number), "该数字已存在,请重新输入!"); } else { ModelState.AddModelError(string.Empty, "保存失败,请稍后重试!"); } } }
三、数据库层面兜底(终极保障)
直接给数据库里存储数字的字段加唯一约束,这样就算程序层面的校验都漏了,数据库也会拒绝重复数据,我们只需要捕获对应的异常即可(上面的try-catch已经处理了这个情况)。
这样一套组合拳下来,既让用户在输入时就能得到即时反馈,又从程序和数据库层面双重保障了数据的唯一性,完全满足你的需求~
备注:内容来源于stack exchange,提问作者Rickymail
相关产品推荐
相关产品推荐

