.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
相关产品推荐
相关产品推荐

