blazor页面中列表的数据注释



我使用以下内容对blazor(服务器(中的表单进行验证

<EditForm Model="@place" OnValidSubmit="HandleValidSubmit" Context="placesEdit" >
<DataAnnotationsValidator />
<InputText @bind-Value="place.Name"/>
<ValidationMessage For="() => place.Name" />
</EditForm>
@{place=new Place(); }

属性CCD_ 1作为CCD_这很好。提交表单时,我看到错误消息,HandleValidSubmit不被称为

但是,当我尝试对List执行同样的操作时,验证不会发生。即使不满足要求,也不会显示错误,而是调用HandleValidSubmit

<EditForm Model="@places" OnValidSubmit="HandleValidSubmit" Context="placesEdit" >
<DataAnnotationsValidator />
@foreach(var place in places) {
<InputText @bind-Value="place.Name"/>
<ValidationMessage For="() => place.Name" />
}
</EditForm>
@{places=new List<Place>(); }

做了什么使Validator也能在循环中工作?

如果这有帮助,请尝试:

  1. 添加Microsoft.AspNetCore.Components.DataAnnotations.ValidationNuGet包。
    • 这是一个预发布包,最新版本为3.2.0-rc1.20223.4。有一个计划将其包含在本机Blazor SDK中,但该版本应该可以达到。NET 5。https://github.com/dotnet/aspnetcore/issues/22238#issuecomment-634266426
  2. DataAnnotationsValidator替换为ObjectGraphDataAnnotationsValidator
    • 您可以通过步骤2检查问题是否得到解决。如果没有,请继续执行步骤3
  3. ValidateComplexType为您的列表属性添加注释。
    • 您需要创建一个包含您的列表属性的类

查看文档以了解更多信息:https://learn.microsoft.com/en-us/aspnet/core/blazor/forms-validation#nested-模型集合类型和复杂类型


如果你像我一样使用IValidatableObject,上述解决方案将不起作用。解决方法是创建另一个属性以将验证链接到。

例如

public class MyModel : IValidatableObject
{
public List<Place> Places { get; } = new List<Place>();
public object PlacesValidation { get; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var isValid = ...;
if (isValid)
yield return new ValidationResult("Places is invalid.", new[] { nameof(PlacesValidation ) });
}
}
<ValidationMessage For="() => Model.PlacesValidation"/>

相关内容

  • 没有找到相关文章

最新更新