Blazor校验场景下如何通知EditContext字段已变更?
表单提交触发校验的逻辑
EditForm 组件内部处理提交逻辑时,会主动调用 EditContext.Validate() 方法,该方法会对当前关联模型的所有标注了校验规则的字段执行全量校验,无论对应字段是否触发过变更通知,校验结果都会同步到上下文,因此所有不符合规则的字段的错误提示都会正常渲染。
原生 input 用 @bind-value 绑定时仅会完成属性赋值,不会主动调用 EditContext.NotifyFieldChanged(),因此字段变更时不会触发字段级的即时校验,只有等提交时全量校验才会捕获错误。而 Blazor 内置的 InputText 等 InputBase 派生控件,内部已经封装了变更时自动发通知的逻辑,所以实时校验可以正常工作。
更优雅的实时校验实现方案
不需要用反射、不需要调用内部API,下面两种方案都是基于公共API实现,稳定性有保证:
方案1:少量字段直接手写绑定逻辑
如果需要处理的字段不多,直接手动写 onchange 逻辑即可,是最简单无依赖的方案:
<input value="@this.MiddleName" class="form-control" @onchange="e => { MiddleName = e.Value?.ToString(); EditContextRef.NotifyFieldChanged(() => MiddleName); }" /> <ValidationMessage For="() => this.MiddleName"></ValidationMessage>
方案2:字段较多时封装通用绑定方法
如果有大量原生输入控件需要处理,可以封装一个通用的绑定生成方法,不需要反射也不需要调用内部的 CreateBinder:
@code { // 通用绑定生成方法,支持任意类型字段 private EventCallback<ChangeEventArgs> CreateFieldBinder<T>( Action<T> valueSetter, Expression<Func<T>> fieldAccessor) { return EventCallback.Factory.Create<ChangeEventArgs>(this, e => { // 做类型转换适配不同的输入类型 var parsedValue = (T)Convert.ChangeType(e.Value, typeof(T)); valueSetter(parsedValue); // 触发字段变更通知,自动触发校验 EditContextRef.NotifyFieldChanged(fieldAccessor); }); } }
使用时直接调用即可,代码非常简洁:
<input value="@this.LastName" class="form-control" @onchange="CreateFieldBinder(v => LastName = v, () => LastName)" /> <ValidationMessage For="() => this.LastName"></ValidationMessage>
内容的提问来源于stack exchange,提问作者b_levitt
相关产品推荐
相关产品推荐

