对一些模型使用NotEqual规则的流畅验证,并在验证成功时得到一个奇怪的错误。我们的模型有两个字段,它们都是复杂的用户模型。他们之间不可能是一样的。当它们相同时,fluent验证器正确工作,并显示我的自定义错误消息。但是,当它们不一样时,不应该显示错误文本,这就是我所看到的:

根本没什么意义。知道发生了什么事吗?
验证器类:
using FluentValidation;
using Data.Models.DBModels;
namespace Compyl.WebApp.Validators
{
public class AssessmentModelFluentValidator : AbstractValidator<AssessmentModel>
{
public AssessmentModelFluentValidator()
{
RuleLevelCascadeMode = CascadeMode.Stop;
RuleFor(x => x.Owner)
.NotEqual(x=> x.DelegateOwner)
.WithMessage("Owner cannot be the same as Delegate Owner")
.NotEqual(X => X.Reviewer)
.WithMessage("Owner cannot be the same as Reviewer");
RuleFor(x => x.DelegateOwner)
.NotEqual(x => x.Owner)
.WithMessage("Delegate Owner cannot be the same as Owner")
.NotEqual(X => X.Reviewer)
.WithMessage("Delegate Owner cannot be the same as Reviwer");
RuleFor(x => x.Reviewer)
.NotEqual(x => x.Owner)
.WithMessage("Reviewer cannot be the same as Owner")
.NotEqual(X => X.DelegateOwner)
.WithMessage("Reviewer cannot be the same as Delegate Owner");
}
public Func<object, string, Task<IEnumerable<string>>> ValidateValue => async (model, propertyName) =>
{
var result = await ValidateAsync(ValidationContext<AssessmentModel>.CreateWithOptions((AssessmentModel)model, x => x.IncludeProperties(propertyName)));
if (result.IsValid)
return Array.Empty<string>();
return result.Errors.Select(e => e.ErrorMessage);
};
}
}表格的一部分:
<MudForm @ref="form" Model="@assessment" @bind-IsValid="@success" Validation="@(assessmentValidator.ValidateValue)" @bind-Errors="@errors">
<MudCard Elevation="0">
<MudCardHeader>
<CardHeaderContent>
<MudText Typo="Typo.h6">@assessment.Name</MudText>
<MudText>@assessment.Description</MudText>
</CardHeaderContent>
</MudCardHeader>
<MudCardContent>
<MudTabs Elevation="2" Rounded="true" ApplyEffectsToContainer="true" PanelClass="pa-6">
<MudTabPanel Text="Assessment Details">
<MudTextField Immediate="true" For="@(() => assessment.Name)" Variant="Variant.Outlined" Disabled="@(!canEdit)" RequiredError="Assessment Name is Required!" Required Label="Name" @bind-Value="assessment.Name" />
<MudTextField For="@(() => assessment.Description)" Variant="Variant.Outlined" Disabled="@(!canEdit)" Lines="4" Label="Description" @bind-Value="assessment.Description" />
<MudAutocomplete Immediate="true" For="@(() => assessment.Owner)" Variant="Variant.Outlined" Disabled="@(!canEdit)" T="UserModel" @bind-Value="assessment.Owner" RequiredError="Assessment Owner is Required!" Required Label="Owner" ToStringFunc="@(e=> e==null? null : $"{e.Email}")" SearchFunc="@SearchUsers" />
<MudAutocomplete Immediate="true" For="@(() => assessment.DelegateOwner)" Variant="Variant.Outlined" Disabled="@(!canEdit)" T="UserModel" @bind-Value="assessment.DelegateOwner" Label="Delegate Owner" ToStringFunc="@(e=> e==null? null : $"{e.Email}")" SearchFunc="@SearchUsers" />
<MudAutocomplete Immediate="true" For="@(() => assessment.Reviewer)" Variant="Variant.Outlined" Disabled="@(!canEdit)" T="UserModel" @bind-Value="assessment.Reviewer" RequiredError="Assessment Reviewer is Required!" Required Label="Reviewer" ToStringFunc="@(e=> e==null? null : $"{e.Email}")" SearchFunc="@SearchUsers" />发布于 2022-08-17 23:05:12
不能将对象与流畅验证进行比较。你必须比较个别的属性。在这种情况下,比较ID (我猜是属性名)是有意义的。
RuleFor(x => x.Reviewer.Id)
.NotEqual(x => x.Owner.Id)
.WithMessage("Reviewer cannot be the same as Owner")
.NotEqual(X => X.DelegateOwner.Id)
.WithMessage("Reviewer cannot be the same as Delegate Owner");发布于 2022-08-18 15:39:38
这在一定程度上是Bron在评论中的回答,但也与MudBlazor的“不处理”复杂对象的“原因”有关。解决方法是将复杂模型的ID绑定到字段,而不是整个模型。这样,您可以为ID设置规则和for语句。
https://stackoverflow.com/questions/73395202
复制相似问题