You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:15:20