Episerver专用属性使用自定义特性时客户端验证不生效问题
问题原因
Episerver的实时客户端验证基于ASP.NET MVC的jQuery Validation验证体系,只有适配了这套体系的验证特性才会触发前端实时校验,你遇到的差异本质是自定义特性没有做客户端适配:
- 系统内置的
RegularExpressionAttribute原生实现了IClientValidatable接口,会自动给表单元素输出data-val-regex等验证规则属性,且Episerver默认已经注册了对应正则规则的前端验证适配器,所以可以直接触发实时校验。 - 你自己封装的自定义验证特性默认只有服务端验证逻辑,没有实现
IClientValidatable接口输出前端验证标记,也没有注册对应的前端验证适配器,因此只有发布页面触发服务端校验时才会生效,前端实时验证不会触发。
解决方案
最简单的适配方式是让你的自定义电话验证特性直接继承RegularExpressionAttribute,复用原生已经实现的客户端验证逻辑,不需要额外开发前端适配器:
public class PhoneNumberAttribute : RegularExpressionAttribute { public PhoneNumberAttribute() : base(@"^(\+\s?)?((?<!\+.*)\(\+?\d+([\s\-\.]?\d+)?\)|\d+)([\s\-\.]?(\(\d+([\s\-\.]?\d+)?\)|\d+))*(\s?(x|ext\.?)?\s?\d+)?$") { ErrorMessage = "Invalid Phone Number"; // 非必填逻辑和原生保持一致,空值会自动跳过验证 } }
如果你的自定义验证逻辑更复杂,无法直接继承RegularExpressionAttribute,则需要两步适配:
- 让自定义特性实现
IClientValidatable接口,在GetClientValidationRules方法中返回自定义的验证规则和参数,输出到前端DOM的data-*属性中 - 在Episerver的前端编辑资源中注册对应的jQuery Validation适配器,绑定自定义规则的前端校验逻辑,完成前后端验证规则的匹配。
内容的提问来源于stack exchange,提问作者Farhin Shaikh
相关产品推荐
相关产品推荐

