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

.NET 8 Blazor中嵌套对象表单验证的简便实现方法?

.NET 8 Blazor 嵌套对象表单验证的简便实现方式

在.NET 8 Blazor中,无需依赖已弃用的Microsoft.AspNetCore.Components.DataAnnotations.Validation包,就能通过原生方案实现嵌套对象的表单验证,以下是两种常用方式:

一、原生DataAnnotationsValidator开启对象图验证

.NET 8的DataAnnotationsValidator组件新增了ValidateObjectGraph参数,设置为true后会自动递归验证嵌套对象的DataAnnotations特性(如Required、StringLength等)。

示例代码

模型类

public class ParentModel
{
    [Required(ErrorMessage = "父级名称不能为空")]
    public string ParentName { get; set; }

    public ChildModel Child { get; set; } = new ChildModel();
}

public class ChildModel
{
    [Required(ErrorMessage = "子级名称不能为空")]
    [StringLength(10, ErrorMessage = "子级名称不能超过10个字符")]
    public string ChildName { get; set; }
}

Blazor组件

<EditForm Model="@Parent" OnValidSubmit="@HandleValidSubmit">
    <DataAnnotationsValidator ValidateObjectGraph="true" />
    <ValidationSummary />

    <div>
        <label>父级名称:</label>
        <InputText @bind-Value="Parent.ParentName" />
        <ValidationMessage For="@(() => Parent.ParentName)" />
    </div>

    <div>
        <label>子级名称:</label>
        <InputText @bind-Value="Parent.Child.ChildName" />
        <ValidationMessage For="@(() => Parent.Child.ChildName)" />
    </div>

    <button type="submit">提交</button>
</EditForm>

@code {
    private ParentModel Parent { get; set; } = new ParentModel();

    private void HandleValidSubmit()
    {
        // 处理表单提交逻辑
    }
}

二、自定义跨嵌套对象验证逻辑

如果需要实现父对象与子对象之间的关联验证(比如两者属性值不能重复),可以让父模型实现IValidatableObject接口,在Validate方法中编写自定义规则。

示例代码

模型类(含自定义验证)

public class ParentModel : IValidatableObject
{
    [Required(ErrorMessage = "父级名称不能为空")]
    public string ParentName { get; set; }

    public ChildModel Child { get; set; } = new ChildModel();

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // 验证父级名称与子级名称不能相同
        if (!string.IsNullOrEmpty(ParentName) && ParentName == Child?.ChildName)
        {
            yield return new ValidationResult(
                "父级名称和子级名称不能重复",
                new[] { nameof(ParentName), nameof(Child.ChildName) });
        }
    }
}

public class ChildModel
{
    [Required(ErrorMessage = "子级名称不能为空")]
    [StringLength(10, ErrorMessage = "子级名称不能超过10个字符")]
    public string ChildName { get; set; }
}

Blazor组件

只需保持和第一种方式相同的EditForm结构,DataAnnotationsValidator会自动触发自定义的验证逻辑。

内容的提问来源于stack exchange,提问作者WinFXGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:26:17