首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Fluent验证API和Mud Blazor时出现的奇怪错误

使用Fluent验证API和Mud Blazor时出现的奇怪错误
EN

Stack Overflow用户
提问于 2022-08-17 21:40:52
回答 2查看 198关注 0票数 1

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

根本没什么意义。知道发生了什么事吗?

验证器类:

代码语言:javascript
复制
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);
        };
    }
}

表格的一部分:

代码语言:javascript
复制
<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" />
EN

回答 2

Stack Overflow用户

发布于 2022-08-17 23:05:12

不能将对象与流畅验证进行比较。你必须比较个别的属性。在这种情况下,比较ID (我猜是属性名)是有意义的。

代码语言:javascript
复制
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");
票数 0
EN

Stack Overflow用户

发布于 2022-08-18 15:39:38

这在一定程度上是Bron在评论中的回答,但也与MudBlazor的“不处理”复杂对象的“原因”有关。解决方法是将复杂模型的ID绑定到字段,而不是整个模型。这样,您可以为ID设置规则和for语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73395202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档