我使用以下内容对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也能在循环中工作?
如果这有帮助,请尝试:
- 添加
Microsoft.AspNetCore.Components.DataAnnotations.Validation
NuGet包。- 这是一个预发布包,最新版本为3.2.0-rc1.20223.4。有一个计划将其包含在本机Blazor SDK中,但该版本应该可以达到。NET 5。https://github.com/dotnet/aspnetcore/issues/22238#issuecomment-634266426
- 将
DataAnnotationsValidator
替换为ObjectGraphDataAnnotationsValidator
- 您可以通过步骤2检查问题是否得到解决。如果没有,请继续执行步骤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"/>