如何用Fluent Validation实现文件上传必填校验(替代required属性)
用Fluent Validation实现文件选择的强制性校验
我来帮你搞定这个问题!你当前的校验逻辑只处理了已上传文件的规则,但完全没覆盖“用户未选择任何文件”的场景。要替代input[type='file']的required属性,只需要在UploaderValidator中添加对Files集合的非空校验即可,具体步骤如下:
修改UploaderValidator类
直接在你的UploaderValidator构造函数里,先添加一条针对Files集合的非空校验规则,再保留原有的逐个文件校验:
public class UploaderValidator : AbstractValidator<FileUploadViewModel> { public UploaderValidator() { // 核心:校验Files集合不能为空/没有任何元素 RuleFor(x => x.Files) .NotEmpty() .WithMessage("请至少选择一个文件"); // 自定义提示信息 // 原有:校验每个选中文件的规则 RuleForEach(x => x.Files).SetValidator(x => new FileValidator()); } }
规则说明
NotEmpty()会同时检查两种情况:Files为null,或者Files集合里没有任何元素(也就是用户没选文件)。- 搭配
WithMessage()可以自定义友好的提示文本,比默认提示更贴合业务场景。
额外场景:单个文件上传的情况
如果你的视图模型是单个文件(而非集合),那对应的校验逻辑可以这么写:
public class SingleFileUploadValidator : AbstractValidator<SingleFileUploadViewModel> { public SingleFileUploadValidator() { // 校验文件是否被选择 RuleFor(x => x.File) .NotNull() .WithMessage("请选择要上传的文件"); // 校验文件大小(注意加When条件,避免文件为null时抛出空引用异常) RuleFor(x => x.File.Length) .LessThanOrEqualTo(100) .When(x => x.File != null); } }
这样不管是单个还是多个文件上传,都能通过Fluent Validation实现服务器端的强制性文件选择校验,完全替代前端required属性的功能,还能保持前后端校验逻辑的一致性。
内容的提问来源于stack exchange,提问作者farshid
相关产品推荐
相关产品推荐

