Blazor:基于其他字段的自定义验证实现
Blazor 基于其他字段的自定义验证实现方案
当然可以实现这种联动验证,你只需要利用ValidationContext获取整个模型实例,就能访问到其他字段的值来判断验证逻辑。以下是具体的修改方案:
1. 修改自定义验证属性
修正原验证类的拼写错误(PhoneNumberValidaton → PhoneNumberValidation),并加入跨字段判断逻辑:
public class PhoneNumberValidation : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // 获取当前验证的模型实例 var model = validationContext.ObjectInstance as UserModel; if (model == null) { return ValidationResult.Success; } // 仅当勾选「接收短信」时,检查电话号码是否为空 if (model.CanReceiveText && string.IsNullOrEmpty(value?.ToString())) { return new ValidationResult("勾选接收短信时,电话号码为必填项", new[] { validationContext.MemberName }); } return ValidationResult.Success; } }
2. 修正模型中的验证属性引用
确保模型中使用正确的验证类名:
public class UserModel { public int Id { get; set; } [Required] [Display(Name = "名字")] public string FirstName { get; set; } [Required] [Display(Name = "姓氏")] public string LastName { get; set; } [PhoneNumberValidation] [Display(Name = "电话号码")] public string Phone { get; set; } [Display(Name = "接收短信")] public bool CanReceiveText { get; set; } }
3. Blazor表单中使用示例
在组件中通过EditForm和DataAnnotationsValidator自动触发验证:
<EditForm Model="@userModel" OnValidSubmit="@HandleValidSubmit"> <DataAnnotationsValidator /> <ValidationSummary /> <div class="form-group"> <label>@userModel.FirstName的显示名称:</label> <InputText @bind-Value="userModel.FirstName" class="form-control" /> <ValidationMessage For="@(() => userModel.FirstName)" /> </div> <div class="form-group"> <label>@userModel.LastName的显示名称:</label> <InputText @bind-Value="userModel.LastName" class="form-control" /> <ValidationMessage For="@(() => userModel.LastName)" /> </div> <div class="form-group"> <label> <InputCheckbox @bind-Value="userModel.CanReceiveText" /> @userModel.CanReceiveText的显示名称 </label> </div> <div class="form-group"> <label>@userModel.Phone的显示名称:</label> <InputText @bind-Value="userModel.Phone" class="form-control" /> <ValidationMessage For="@(() => userModel.Phone)" /> </div> <button type="submit" class="btn btn-primary">提交</button> </EditForm> @code { private UserModel userModel = new UserModel(); private void HandleValidSubmit() { // 处理表单提交逻辑,比如保存数据 } }
关键说明
- 通过
validationContext.ObjectInstance可以获取到整个模型对象,从而读取其他字段的状态 - 验证逻辑仅在
CanReceiveText为true时触发,避免不必要的验证 - 确保
DataAnnotationsValidator组件已添加到EditForm中,它会自动扫描并应用所有数据注解验证规则
内容的提问来源于stack exchange,提问作者JavaKB
相关产品推荐
相关产品推荐

