【问题标题】:Blazor validation of List of Child Components子组件列表的 Blazor 验证
【发布时间】:2021-05-26 06:06:19
【问题描述】:

我正在尝试使用 Blazor 中的子组件列表来实现 ObjectGraphDataAnnotationsValidatorAnimals 的列表绑定在一个表单中,由 for 循环呈现。 Child 类的属性之一是必需的。 这是代码:

Test.razor

@using System.ComponentModel.DataAnnotations
@page  "/Test"
@code {
    public class MyClass
    {
        public MyClass()
        {
            Animals = new List<AnimalItem>();
        }
        [Required]
        public string FormName { get; set; }
        public IList<AnimalItem> Animals { get; set; }
    }

    public class AnimalItem
    {
        [Required]
        public string Name { get; set; }
    }

    protected override async Task OnInitializedAsync()
    {
        MyFormData = new MyClass()
        {
            Animals = new List<AnimalItem>()
            {
                new AnimalItem { Name = "Fuffy" },
                new AnimalItem { Name = "Flaffy" }
            }
        };
        await base.OnInitializedAsync();
    }

    public MyClass MyFormData { get; set; }

    private void OnValidSubmit()
    {
    }
}

<EditForm Model="MyFormData" OnValidSubmit="@OnValidSubmit" >
    <ObjectGraphDataAnnotationsValidator />
    <ValidationSummary /> 
    <InputText type="text" @bind-Value="MyFormData.FormName"/>
    @foreach (var animal in MyFormData.Animals)
    {
        <Animal AnimalItem="animal"></Animal>
    }
    <button type="submit">Post</button>
</EditForm>

这是我的组件:

Animal.razor

@code {
    [Parameter]
    public Test.AnimalItem AnimalItem { get; set; }
}
<label for="Animal">Animal</label>
<InputText  id="Animal" type="text" @bind-Value="@AnimalItem.Name" />

当我编辑组件列表并清除 Name 字段时,表单正确地通知我 Name 属性是必需的。但是,如果我按下提交按钮,这并不妨碍我保存它。 我究竟做错了什么?欢迎提供有关如何在 Blazor 中调试验证的任何建议:)

谢谢

【问题讨论】:

  • 您无需在当前示例中实现 ObjectGraphDataAnnotationsValidator。
  • @enet 抱歉,我错过了您的评论。你的意思是?没有ObjectGraphDataAnnotationsValidator ,只有顶层被验证
  • 我的意思是你的代码永远无法工作。

标签: blazor blazor-server-side blazor-validation


【解决方案1】:

我认为您可能需要将[ValidateComplexType] 添加到MyClass 上的Animals 集合中

    public class MyClass
    {
        public MyClass()
        {
            Animals = new List<AnimalItem>();
        }
        [Required]
        public string FormName { get; set; }
        [ValidateComplexType]
        public IList<AnimalItem> Animals { get; set; }
    }   

MS Docs Section on Complex Types

【讨论】:

  • 我编辑了答案,因为该属性需要放在集合属性上。非常感谢您指导我找到解决方案!
  • 没问题。 :-)
猜你喜欢
  • 2021-09-11
  • 2022-01-09
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
相关资源
最近更新 更多