Kendo Grid重复值保存拦截实现咨询:创建方法代码相关疑问
关于Kendo Grid重复值拦截方案的分析与优化建议
现有实现的合理性分析
你当前在后端创建逻辑里通过查询数据库判断ProviderTypeName是否重复的思路是合理且有效的——毕竟在数据持久化前做校验,能从业务逻辑层面避免重复数据进入数据库。不过这个实现还有几个可以打磨的地方:
- 没考虑并发场景:如果多个请求同时提交相同的
ProviderTypeName,可能会出现竞态条件,导致重复数据“钻空子”插入成功。 - 代码复用性差:要是后续其他接口也需要做重复值校验,这段查询逻辑得反复复制粘贴。
- 缺少数据库层面的兜底:万一有其他渠道(比如直接操作数据库的脚本)插入数据,仅靠代码校验就拦不住了。
更优的重复值拦截方案
我推荐从前端即时反馈+后端逻辑校验+数据库约束兜底三层构建拦截体系,既提升用户体验,又保证数据绝对可靠:
1. 前端拦截:提前给用户反馈
在Kendo Grid的编辑环节,就对输入的ProviderTypeName做即时校验,不用等用户提交后才报错:
$("#grid").kendoGrid({ // 其他网格配置... edit: function(e) { const nameInput = e.container.find("[name='ProviderTypeName']"); nameInput.on("blur", function() { const inputValue = $(this).val().trim(); if (!inputValue) return; // 调用后端校验接口判断是否重复 $.get("/api/ProviderTypeMasters/CheckDuplicate?name=" + encodeURIComponent(inputValue), function(isDuplicate) { if (isDuplicate) { alert("这个供应商类型名称已经存在啦,请换一个"); $(this).val("").focus(); } }); }); } });
这样用户输入时就能立刻知道问题,体验会顺畅很多。
2. 后端优化:增强可靠性与复用性
- 封装校验逻辑:把重复值校验抽成公共方法,方便在多个地方复用:
private async Task<bool> IsProviderTypeNameDuplicate(string name) { return await _context.TblProviderTypeMasters.AnyAsync(p => p.ProviderTypeName == name); }
然后在创建方法里调用:
foreach (var providerType in ProviderTypeMasterList) { if (await IsProviderTypeNameDuplicate(providerType.ProviderTypeName)) { results.Add(new ProviderTypeMasterViewModel { Id = 0, ErrorMessage = $"供应商类型「{providerType.ProviderTypeName}」已存在" }); continue; } // 正常的实体转换与入库逻辑... }
- 处理并发冲突:捕获数据库唯一索引抛出的异常(比如SQL Server的错误码2601/2627),给用户返回友好提示:
try { await _context.SaveChangesAsync(); } catch (SqlException ex) { if (ex.Number is 2601 or 2627) { results.Add(new ProviderTypeMasterViewModel { ErrorMessage = "提交的内容中存在重复的供应商类型名称" }); } else { throw; // 非重复异常正常抛出 } }
3. 数据库兜底:最后一道防线
直接给TblProviderTypeMasters表的ProviderTypeName字段添加唯一约束,这是最可靠的兜底手段:
ALTER TABLE TblProviderTypeMasters ADD CONSTRAINT UQ_ProviderTypeName UNIQUE (ProviderTypeName);
不管数据是从接口、脚本还是其他渠道插入,数据库都会直接拦截重复值,从根源上杜绝重复数据。
总结
你的现有方案能解决基本问题,但通过三层拦截的方式,既能让用户体验更流畅,又能在并发场景和异常渠道下保证数据的唯一性,整个系统会更健壮。
内容的提问来源于stack exchange,提问作者Sam Daniel
相关产品推荐
相关产品推荐

