Blazor前端中Transform方法弃用后,如何使用新计算属性方案?
解决Blazor中FluentValidation计算属性验证不触发的问题
问题背景
原本计划使用FluentValidation的Transform方法做值转换验证,但该方法即将被移除,官方推荐改用计算属性的方式。但在Blazor中搭配Blazored FluentValidation和HxInputText组件时,遇到了验证不触发的问题:控件绑定的是模型的SomeValue字符串属性,而验证规则针对的是基于该属性生成的计算属性SomeValueAsInt,输入内容时前端没有任何验证反馈,旧Transform方法则能正常工作。
尝试的代码如下:
// 迁移后的模型,用计算属性做转换 class Foo { public string SomeValue { get; set; } public int? SomeValueAsInt => int.TryParse(SomeValue, out int val) ? val : null; } public class FooValidator : AbstractValidator<Foo> { public FooValidator() { RuleFor(x => x.SomeValueAsInt).NotNull().GreaterThan(5); } }
前端绑定代码:
<HxInputText @bind-Value="SomeValue" Label="请输入大于5的整数" />
解决方案
方案一:直接针对原属性编写验证规则
不需要依赖计算属性,直接在原字符串属性的验证规则里完成解析和校验,让验证逻辑直接关联到输入绑定的属性,输入时即可实时触发验证:
public class FooValidator : AbstractValidator<Foo> { public FooValidator() { RuleFor(x => x.SomeValue) .Must(input => { return int.TryParse(input, out int parsedVal) && parsedVal > 5; }) .WithMessage("请输入一个大于5的有效整数") .NotNull(); // 可根据业务需求添加非空校验 } }
方案二:为计算属性添加变更通知(坚持使用计算属性时)
问题核心是Blazor的验证系统无法感知计算属性SomeValueAsInt随SomeValue的变化,因此需要让模型实现INotifyPropertyChanged接口,在原属性的setter里同时通知计算属性的变更:
using System.ComponentModel; using System.Runtime.CompilerServices; class Foo : INotifyPropertyChanged { private string _someValue; public string SomeValue { get => _someValue; set { if (_someValue != value) { _someValue = value; OnPropertyChanged(); // 主动通知计算属性已变更 OnPropertyChanged(nameof(SomeValueAsInt)); } } } public int? SomeValueAsInt => int.TryParse(SomeValue, out int val) ? val : null; public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
这样当输入框修改SomeValue时,模型会同时触发SomeValue和SomeValueAsInt的变更通知,Blazored FluentValidation就能检测到计算属性的变化,触发对应的验证规则。
内容的提问来源于stack exchange,提问作者chobo2
相关产品推荐
相关产品推荐

