ASP.NET Core Telerik Grid弹窗中Country Code字段唯一性远程验证异常问题
看起来你遇到的问题主要出在远程验证方法的参数缺失和编辑场景下未排除当前实体这两个关键点上,咱们一步步来修复:
1. 修复控制器KeyExist方法的参数问题
你当前的KeyExist方法里用到了id变量,但方法签名里并没有接收这个参数,这会直接导致运行时异常。另外,编辑场景下必须传递当前实体的Id,这样验证时才能排除自身(不然编辑现有国家时,它自己的Code会被误判为重复)。修改后的方法如下:
[AcceptVerbs("GET", "POST")] public IActionResult KeyExist(string code, int? id) { // 新增场景(id为null)直接检查code是否存在;编辑场景排除当前id对应的记录 bool isDuplicate = _countriesService.KeyExist(code, id.GetValueOrDefault(0)); if (isDuplicate) { return Json($"The Code '{code}' is already used!"); } return Json(true); }
这里把参数名从key改成了code(和DTO字段名一致,模型绑定更顺畅),同时新增int? id参数来接收当前编辑实体的Id。
2. 更新Remote特性,传递Id参数
原来的Remote特性只指定了验证方法,没有传递当前实体的Id,编辑时无法排除自身。需要修改CountryDTO里的Code字段特性,添加AdditionalFields来携带Id值:
[Required] [MaxLength(2)] [Remote(action: "KeyExist", controller: "Countries", AdditionalFields = nameof(Id))] public string Code { get; set; }
AdditionalFields会告诉ASP.NET Core把Id字段的值一同发送到验证接口,让控制器能区分“新增”和“编辑”场景。
3. 确认编辑器模板与Telerik Grid的绑定
你的编辑器模板里已经包含了<input type="hidden" asp-for="Id" />,这部分没问题。只需确保Telerik Grid在编辑模式下,正确将当前实体的Id绑定到模板的隐藏字段中——如果使用的是Telerik的弹出式/内联编辑,只要DTO的Id值正确传递,这一步无需额外修改。
4. 验证客户端请求参数
修改完成后,测试编辑场景:当修改Code字段失去焦点时,打开浏览器开发者工具,查看验证请求的参数是否包含code和id两个值。只要参数正确传递,控制器就能准确判断Code是否重复。
最后还要确认_countriesService.KeyExist的实现逻辑:当传入id时,查询要排除该Id对应的记录,只检查其他实体的Code是否重复。
内容的提问来源于stack exchange,提问作者serge

